2011-03-15 18 views
5

私の質問から、EAVについて続けると、私はMongoDBを使用して製品属性を格納することを検討しています。Doctrine ODMとスキーマレス設計

カテゴリ、製品、および関連するすべての情報をMongoDB(または別のドキュメントデータベース)でこのアプリケーションのカタログ部分を保存します。

私の質問は、ODMを使用すると、各エンティティにスキーマがないため、NoSQLデータベースを使用するスキーマレスの利点は基本的に無視されます。

これが正しい場合は、誰がODMを使用するのですか?

EDIT:related questionが見つかりました。ハッシュを使用して製品属性の機能を実現できますか?

答えて

5

ソリューションはここ@Hash

を使用することですが、私がアップしました非常に基本的な例です。

<?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; 
    } 

} 

は、いくつかのデータを追加します。次に

<?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(); 

クエリ、製品を見つけます色が「黒」で、画面サイズが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では、フィールドの追加または削除は時間がかかるモノリシックな操作です。ちょっとした計画を立てれば、ドキュメントにアクセスしたときにフィールドを追加または削除できます。旧式のスキーマを処理するコードが必要です。

関連する問題