2013-06-19 3 views
3

개체 데이터를 저장하기 위해 EAV 구조를 사용하는 시스템에서 작업 할 것입니다.Ellquent ORM and EAV

  • X
  • Y
  • Z
  • 시작 날짜/시간
  • 종료 날짜/시간 : 모델 자체는 몇 가지 미리 정의 된 속성, 즉 (좌표 및 날짜/시간 스탬프)을해야합니다

나머지 속성은 사용자가 동적으로 만들고 속성 테이블에 행으로 추가됩니다. 이 행은 피벗되고 값 테이블과 정렬하기위한 열로 사용됩니다 (설명이 필요한지 확실하지 않았지만 미안한 것보다 안전하다고 생각 됨).

속성에 대한 객체 (또는 엔티티) 관계는 일대 다입니다.

속성 값 연결은 일대 다입니다.

나는 Eloquent/Laravel을 처음 사용하지만 관계 문서를 읽고 일대 다 관계에 대한 기능이 있음을 확인했지만 EAV에서 모든 데이터를 참조 할 수 있는지는 분명하지 않습니다. RDBMS에 맞게 조정). 이런 식으로 될 것입니까? (이것은 매우 모범적 인 예입니다).

class UserObject extends Eloquent { 

    public function object_data() 
    { 
     return $this->hasMany(attributes_data); 
    } 

    public function attributes_data() 
    { 
     return $this->hasMany('Values'); 
    } 

} 

기본적으로, 내 질문은 :

EAV와 관련된 모든 데이터를 검색 할 때 모델을 작성/설계에 대한 승인 (또는 적절한) 방법이 있습니까? 그렇다면 Eloquent/EAV 접근법에 대한 몇 가지 문서 또는 자습서를 가르쳐 주시겠습니까?

생각 후 일부 :

나의 생각은 내가 EAV의 각 구성 요소에 대해 3 개 클래스를 생성 할 필요가 있다고했다 (즉, 값 엔티티 컴포넌트 데이터에 대한 하나의 속성 데이터를위한 하나, 하나를 데이터).

감사합니다.

답변

6

(나는 다른 포럼 게시물을 통해 발견으로) 이것에 대해 이동 할 수있는 몇 가지 방법이 있습니다

각 EAV 구성 요소, 예를 들어, 모델을 만들기 의사 코드 : 값 데이터를 검색하기 위해 바로 실행 3 개 쿼리가있을 것 같은

class Object extends Eloquent{ 
    public function objects(){ 
     return $this->hasMany('Attribute'); 
    } 
} 

class Attribute extends Eloquent{ 
    public function attributes(){ 
     return $this->hasMany('Value'); 
    } 
} 

class Value extends Eloquent{ 
    public function values(){ 
     return /* etc. */; 
    } 
} 

이 성능 저하의 원인이됩니다.

를 사용하여 쿼리 빌더

선택() -> 가입() -> 여기서 ("속성", "=", "뭔가")

이 또한 성능 저하의 원인이됩니다.

$results = DB::select('select * from users where id = ?', array(1)); 

사이드 참고 :

Laravel의

DB 기능은

는 기본적으로 직접 아마도 Laravel 사이트에서 최소한의 오버 헤드의 양, 예를 일으킬 것이다 SQL 쿼리를 실행 이러한 종류의 시스템 (속성이 동적이고 알려지지 않은 경우)에서는 EAV를 완전히 피하고 No-SQL 솔루션을 고수하는 것이 가장 좋습니다. 여기서 w Laravel과 orking하는 것이 더 직관적 일 것입니다. 나는이 옵션을 고려해 왔으며 장기간에 걸쳐이 옵션을 사용할 것입니다.

+0

안녕하세요, NO SQL 솔루션에 대해 자세히 설명해 주시겠습니까? 왜냐하면 나는 나의 데이터베이스에도 EAV를 사용하는 것과 같은 상황과 생각을 가지고 있기 때문입니다! 나는 EAV를 사용하여이 둘을 묶어 놓은 회사의 기능을 갖추게됩니다. 검색 태그, 카테고리 등에 대해서도 마찬가지로 – harishannam

+0

SQL이 없습니까? 나는 또한 더 많은 정보를 원합니다 .... –

+1

@MikelBitson 'No SQL'으로, quandrei는 'MongoDB'와 같은 솔루션을 의미 했음에 틀림 없으나, mySQL 내의 JSON으로 인코딩 된 컬럼도 사용할 수 있습니다. –