2011-03-15 2 views
5

계속 내 질문에 대한 EAV에 대해, 나는 제품 속성을 저장하기 위해 MongoDB를 사용하는 것을 고려하고있다.Doctrine ODM 및 스키마없는 디자인

MongoDB (또는 다른 문서 데이터베이스)를 사용하여 카테고리, 제품 및 모든 관련 정보의 카탈로그 부분을 저장합니다.

제 질문은 ODM을 사용할 때 각 엔티티에 NoSQL 데이터베이스 사용의 스키마없는 이점을 본질적으로 무시하는 스키마가 있다는 것입니다. 그렇지 않습니다.

이것이 맞으면 왜 ODM을 사용합니까?

편집 : related question을 찾았습니다. 해시를 사용하여 제품 속성 기능을 구현할 수 있습니까?

답변

5

솔루션은 @Hash 여기

I가했던 아주 기본적인 예이다 사용하는 것입니다 : 제품 검색,

다음
<?php 

$pen = new Product(); 
$pen->setName('Cool Pen'); 
$pen->addAttribute('Weight', 12); 
$pen->addAttribute('Ink Colour', 'Red'); 
$pen->addAttribute('Colour', 'Black'); 

$tv = new Product(); 
$tv->setName('LED LCD TV'); 
$tv->addAttribute('Weight', 12550); 
$tv->addAttribute('Screen Size', 32); 
$tv->addAttribute('Colour', 'Black'); 

$dm->persist($pen); 
$dm->persist($tv); 

$dm->flush(); 

쿼리

<?php 

/** 
* @Document 
*/ 
class Product 
{ 

    /** 
    * @Id 
    */ 
    private $id; 

    /** 
    * @String 
    */ 
    private $name; 

    /** 
    * @Hash 
    */ 
    private $attributes = array(); 

    public function getId() 
    { 
     return $this->id; 
    } 

    public function setName($name) 
    { 
     $this->name = $name; 
    } 

    public function getName() 
    { 
     return $this->name; 
    } 

    public function addAttribute($name, $value) 
    { 
     $key = preg_replace('/[^a-z0-9\ \_]/i', '', $name); 
     $key = preg_replace('/\s+/i', '_', $key); 
     $key = strtolower($key); 
     $this->attributes[$key] = array('value' =>$value, 'label' => $name); 
    } 

    public function getAttribute($name) 
    { 
     return $this->attributes[$name]; 
    } 

    public function getAttributes() 
    { 
     return $this->attributes; 
    } 

} 

일부 데이터를 추가에게 검은 색 "이고 화면 크기가 20보다 큰 경우 :

<?php 

$query = $dm->createQueryBuilder('Catalogue\Product'); 
$products = $query->field('attributes.colour.value')->equals('Black') 
       ->field('attributes.screen_size.value')->gte(20) 
       ->getQuery()->execute(); 

이것이 최선의 방법인지, 내 연구가 아직 진행 중인지 확실하지 않습니다.

1

아무 것도이를 시행하지 않더라도 컬렉션에 대한 기본 스키마를 갖는 것이 좋습니다. 거의 모든 ODM에서는 클래스에 지정되지 않은 필드를 추가 할 수 있습니다. 응용 프로그램에서 허용한다고 가정하면 필드 값을 생략 할 수도 있습니다.

그러나 스키마가없는 데이터 저장소의 가장 큰 장점은 최상위 필드가 문서마다 다를 수 있지만 이러한 필드는 복잡한 데이터 구조가 될 수 있다는 점입니다. 모든 제품에는 배열 인 속성 필드가있을 수 있지만 해당 배열의 내용은 임의로 길거나 짧을 수 있으며 다양한 구조의 해시를 포함 할 수 있습니다. 요청할 경우 ODM은 이러한 해시 위에 객체 레이어를 추가해야합니다.

마지막으로 장점은 스키마를 업그레이드하는 것입니다. SQL에서 필드를 추가하거나 제거하는 것은 시간 소모적 인 모 놀리 식 작업입니다. 약간의 계획을 통해 문서에 액세스 할 때 필드를 추가하거나 제거 할 수 있습니다. 만료 된 스키마를 처리하기위한 코드가 필요합니다.