Он очень похож на типичную структуру интернет-магазина, такую как Magento.
Атрибуты имеют тип данных, например числовой, varchar, текст.
Определения атрибутов хранятся в одной таблице, например eav_attributes. Значения хранятся в отдельных таблицах, специфичных для типа данных.
Скажем, продукту присвоен числовой атрибут. Таблица базы данных, которая содержит связь между атрибутом, продуктом и значением, представляет собой таблицу типа eav_decimal_attribute_values.
Пример схемы таблицы:
Код: Выделить всё
attribute_id | product_id | attribute_value (decimal)
Код: Выделить всё
attribute_id | product_id | attribute_value (varchar(255))
Поэтому я запросите таблицу eav_decimal_attribute_values, чтобы получить все назначенные десятичные атрибуты и их значения для продукта (или получите пустой набор результатов или курс).
И то же самое для других типов атрибутов (eav_varchar_attribute_values , eav_text_attribute_values, ...).
Пока это фактически то же самое, что, например, Magento справляется с этой задачей.
Поскольку я использую типизированный язык, я выбрал следующий дизайн:
Код: Выделить всё
class AttributeDefinition
- string attributeName
- string attributeDescription
- enum dataType // Like 'numeric', 'varchar', 'text', ...
- ...
- ...
abstract class ProductAttributeAssignment
- AttributeDefinition attribute
class DecimalProductAttribute : ProductAttributeAssignment
- double value
- ...
class VarcharProductAttribute : ProductAttributeAssignment
- string value
- ...
class TextProductAttribute : ProductAttributeAssignment
- string value
- ...
Product
- name
- ...
- attributes
// Problematic part: storing different types together
- A TextProductAttribute
- Another TextProductAttribute
- A DecimalProductAttribute
- A VarcharProductAttribute
- ...
Конечно, я мог бы просто создать один конкретный класс ProductAttributeAssignment и всегда хранить значение как строка в памяти, независимо от типа данных, который представляет атрибут. Но представьте, что мне нужно выполнять вычисления с числовыми атрибутами или выполнять поиск по таким функциям, как Длина зарядного кабеля > 120, было бы полезно сохранить типы. Кроме того, когда появятся функции, например, разработчики смогут создавать плагины или хуки.
Проблема в том, что у меня возникают некоторые трудности с кодированием совокупности продуктов. Было бы логично хранить назначения атрибутов продуктов только в объекте Product. Но поскольку для каждого типа атрибута существует свой класс, я не могу просто написать класс типа Product с полем List атрибуты.
Итак, мой вопрос не о хранении вещей в базе данных/постоянном слое, а о написании кода для бизнес-объекта, который владеет вещами, которые на самом деле являются «одной и той же бизнес-вещью», но технически разными типами кода.
Подробнее здесь: https://stackoverflow.com/questions/785 ... -aggregate