Хранение и работа с динамическими свойствами - PullRequest
4 голосов
/ 28 января 2011

Итак, я работаю над приложением электронной коммерции, и мой клиент хочет иметь возможность создавать категории и продукты ... очевидно.Теперь предположим, что у клиента будет около 100 категорий и 20 000 товаров.

Клиенту нужна возможность создавать свойства категории, которые имеют смысл для фильтрации .... таким образом, жесткие диски категории могут иметь такие свойства, как:

  • Емкость
  • Обороты
  • Форм-фактор

В то время как категория Проекторы могут иметь такие свойства, как:

  • Яркость
  • Коэффициент контрастности
  • Собственное разрешение

Мой вопрос заключается в том, как решить проблему динамического создания пользовательских свойств, но возможность использовать эти свойства для поиска, фильтрации и создания отчетов?

Создание отдельной таблицы и объекта для каждой категории невозможно, поскольку я понятия не имею, какие категории они будут создавать (например, HardDriveProperties, ProjectorProperties).

Я подумал, что, возможно, мне удастся создать дополнительный столбец в базе данныхи сериализовать пользовательские свойства как JSON, но для этого все равно потребуется, чтобы я создал конкретный объект свойств для каждой категории для deseriaдобавить JSON в общий список ProductProperties .... с которым, я думаю, может быть довольно дорого работать.

Как другие решают эту проблему?

Ответы [ 4 ]

5 голосов
/ 28 января 2011

Модель Entity-Attribute-Value (также известная как «открытая схема») является одним из способов решения этой проблемы.

Суть шаблона в том, что вы превращаете столбцы в строки. Вместо HardDriveProjector) таблиц, которые выглядят так:

HardDrive(HardDriveID, Capacity, RPMs, FormFactor)
------------------    
1 1TB 7200 External

У вас есть Category, CategoryProperties и CategoryPropertyValues таблицы:

Category(CategoryID, Description)
--------
1 Hard Drive
2 Projector

CategoryProperties(CategoryPropertyID, CategoryID, Description)
------------------
1 1 Capacity
2 1 RPMs
3 1 FormFactor
4 2 Brightness
5 2 Contrast Ratio
... etc.

CategoryPropertyValues(ItemID, CategoryPropertyID, PropertyValue)
------------------
1 1 1TB
1 2 7200
1 3 External
0 голосов
/ 28 января 2011

Я думаю, что ваш последний абзац будет маршрутом, по которому я пойду. Моей главной заботой было бы выполнение (де) сериализации большого количества записей.

0 голосов
/ 28 января 2011

Предполагая, что вы используете реляционную базу данных, я бы, вероятно, использовал что-то вроде в строках этого:

Category(Id, Name)
Property(Id, CategoryId, Description)
Product(Id, CategoryId, Name)
ProductsProperties(Id, ProductId, CategoryId, Value)

Таким образом, вы можете определить, какие свойства должны быть доступны при добавлении / редактировании продукта, которыйпринадлежит к определенной категории, и продукт может иметь свойства inifinite.

Это было бы лучше, чем просто сериализация значений JSON, потому что поиск / фильтрация для сериализованных значений может быть очень болезненной.Однако этот подход использует относительно нормализованную структуру базы данных и, следовательно, может быть медленным для полнотекстового поиска, если у вас много продуктов, свойств, ...

0 голосов
/ 28 января 2011

Создать таблицу Product, в которой есть столбец ProductID.Создайте таблицу ProductAttribute, в которой есть следующие столбцы: Product (ссылка на ProductID), Name, Value.

Один сайт, который я видел, имел несколько столбцов Value, один текст и одно число, чтобы обеспечить эффективный поиск по диапазону числовых значений.

...