5

EAVに関する質問の続きですが、MongoDB を使用して製品属性を保存することを検討しています。

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

私の質問は、ODMを使用する場合、各エンティティにはスキーマがあり、NoSQL データベースを使用するスキーマのない利点を本質的に無視しているのではないでしょうか?

これが正しければ、なぜ ODM を使用するのでしょうか?

編集:関連する質問を見つけました。ハッシュを使用して製品属性機能を実現できますか?

4

2 に答える 2

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

これがこれを行うための最良の方法であるかどうかはまだわかりませんが、私の研究はまだ進行中です。

于 2011-03-15T05:51:16.747 に答える
1

これを強制するものはありませんが、コレクションの基本スキーマを用意することをお勧めします。ほとんどすべてのODMでは、クラスで指定されていないフィールドを追加できます。アプリケーションで許可されている場合は、フィールド値を省略できます。

ただし、スキーマレスデータストアの本当の利点は、最上位のフィールドがドキュメントごとに異なる可能性があることではなく、それらのフィールドが複雑なデータ構造になる可能性があることです。すべての製品には配列である属性フィールドがありますが、その配列のコンテンツは任意の長さまたは短さであり、さまざまな構造のハッシュを含むことができます。必要に応じて、ODMはこれらのハッシュの上にオブジェクトレイヤーを追加する必要があります。

最後の利点は、スキーマをアップグレードすることです。SQLでは、フィールドの追加または削除はモノリシック操作であり、これも時間がかかります。少し計画を立てれば、アクセス時にドキュメントにフィールドを追加したり、ドキュメントからフィールドを削除したりできます。古くなったスキーマを処理するためのコードが必要なだけです。

于 2011-03-21T16:49:32.890 に答える