2011-01-28 3 views
4

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

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

  • Емкость
  • RPMS
  • Форм-фактор

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

  • Яркость
  • Контрастность
  • Native Resolution

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

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

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

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

ответ

5

Entity-Attribute-Value model (aka 'open schema') is один из способов решения этой проблемы.

Суть шаблона заключается в том, что вы создаете столбцы в строки.Вместо 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

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

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

0

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

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

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

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

0

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

Смежные вопросы