2013-01-02 4 views
8

응용 프로그램을 만들고 모델에 ORM을 사용할 계획 이었지만 실제로는 Entity-Attribute-Value 테이블을 사용하는 데이터베이스의 일부가 있습니다.EAV 테이블의 Doctrine ORM

Doctrine ORM은 꽤 좋아하지만 테이블이 실제로 EAV 스타일 인 경우 일반 교리 항목처럼 보이는 클래스를 만들 수 있는지 여부는 알 수 없습니다.

Doctrine을 사용할 수 있습니까? 그렇다면 어떻게해야합니까?

+0

상자 밖으로, 나는 그것을 의심한다. 아마 당신은 자신의 구현을 롤백 할 수 있습니다. Doctrine은 꽤 확장 가능합니다. – ZolaKt

+0

값에 따른 테이블 관계 (데이터 유형에 따라 올바른 속성 - 값 테이블에 참여)가 불가능하므로 (아는 바는) Doctrine을 사용하여이를 수행하는 것은 매우 까다로운 일입니다. –

답변

4

확실히 가능 :

이 같은 관계를 가지고있다 ->의 AttributeValue - 하나> 많은 - 객체 (많은 한을)> AttributeType에 그것을 구축하는 방법 분명한 것 같다 EAV의 관점에서

+1

다른 테이블에 관계가있는 특정 속성을 가져 오려면 어떨까요? – Nico

+0

예, 이것이 문제입니다. 거의 유일한 해결책은 EAV 속성의 속성을 가져 오는 데 코드의 인터페이스를 사용해야한다는 것입니다. 불행히도 복잡한 레이어를 추가해야합니다. –

0

doctrine을 사용하는 entityattribute 사이의 관계. 가장 복잡한 경우에는 Many to Many 관계를 처리합니다.

따라서 Name 속성을 User 엔티티에 매핑한다고 가정 해 보겠습니다. 사용자가 정확히 하나의 이름을 가지고 있으며, 각각의 이름이 정확히 하나의 사용자가이 링크 attributevalue 사이의 관계를 모델링하는 One to One 관계

그러나 방법을 사용하여 보관할 수 있습니다 속한 가정? 문제는 값이 다른 유형이거나 정보를 저장하기 위해 다른 수의 필드가 필요할 수도 있다는 것입니다.

namephone_number 속성을 고려하십시오. 이름은 문자열로 표시 될 수 있지만 전화 번호에는 정수가 필요할 수 있습니다. 또는 번호뿐 아니라 지역 코드도 별도의 필드에 작성해야합니다.

EAV는 매우 유연한 값 표현이 필요하기 때문에 데이터베이스 테이블의 동일한 필드에 모든 값을 저장할 수 없습니다 (BLOB는 무시하고 데이터 직렬화는 무시하십시오). 따라서 대부분의 EAV 구현은 서로 다른 값 유형을 나타내는 서로 다른 테이블을 사용합니다.

이러한 유연성에 도달하기 위해 교리는 Inheritance Mapping입니다. 기본적으로 당신은 교리 실체를 확장 할 수 있습니다.

/** 
    * @Entity 
    * @InheritanceType("JOINED") 
    * @DiscriminatorColumn(name="value_type", type="string") 
    * @DiscriminatorMap({"name" = "Name", "phone" = "PhoneNumber"}) 
*/ 
class Value 
{ 
// ... 
} 

/** @Entity */ 
class Name extends Value 
{ 
// ... 
} 

/** @Entity */ 
class PhoneNumber extends Value 
{ 
// ... 
} 

Value 클래스 즉 ID를 모든 값에 대한 일반적인 구현을 제공합니다 : 당신이 당신의 엔티티의 각 하위 유형에 대한 discriminator을 지정 이렇게. 각 하위 클래스 (예 : NamePhoneNumber)는 이러한 공통 값을 특정 필드 (예 : 추가 입력란)로 확장합니다.

  • @DiscriminatorColumn은 값의 유형을 저장하는 상위 관계의 열을 정의합니다.
  • @DiscriminatorMap은 유형을 @DiscriminatorColumn에서 해당 클래스 중 하나로 매핑하기 위해 doctrine에서 사용됩니다.

attributevalue 사이의 관계를 상위 클래스에 지정할 수 있습니다. 그런 다음 속성에서 값을 호출하면 런타임 중에 필터링 할 수있는 모든 유형의 값 (예 : instanceof)을 가져옵니다.

관련 문제