Доктрина ODM и дизайн без схемы - PullRequest
5 голосов
/ 15 марта 2011

В продолжение моего вопроса о EAV я подумываю использовать MongoDB для хранения атрибутов продукта.

Я буду хранить часть каталога этого приложения - Категории, Продукты и всю связанную с ними информацию - с MongoDB (или другой базой документов).

Мой вопрос заключается в том, что при использовании ODM каждая сущность имеет схему, которая, по существу, не учитывает преимущества схемы без использования базы данных NoSQL, не так ли?

Если это так, зачем кому-то использовать ODM?

РЕДАКТИРОВАТЬ: Я нашел связанный вопрос , могу ли я достичь функциональности атрибутов продукта с помощью хэша?

Ответы [ 2 ]

5 голосов
/ 15 марта 2011

Решение состоит в том, чтобы использовать @ 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 голос
/ 21 марта 2011

Даже если ничто не навязывает это, рекомендуется иметь базовую схему для коллекции.Почти все ODM позволяют добавлять поля, не указанные в классе.Предполагая, что приложение разрешает это, вы также можете не указывать значения полей.

Однако реальное преимущество хранилища данных без схемы состоит не столько в том, что поля верхнего уровня могут отличаться от документа к документу, но и в том, что эти полямогут быть сложные структуры данных.У каждого продукта может быть поле атрибутов, которое является массивом, но содержимое этого массива может быть произвольно длинным или коротким и может содержать хэши с различными структурами.Ваш ODM должен добавить слой объектов поверх этих хешей, если вы попросите его об этом.

Последнее преимущество заключается в обновлении схемы.В SQL добавление или удаление поля - это монолитная операция, которая также занимает много времени.При небольшом планировании вы можете добавлять или удалять поля из документов по мере их доступа.Вам просто нужен код для работы с устаревшей схемой.

...