Доброго дня всем!
Имеется набор товаров. У каждого товара есть некоторые свойства.
Свойства могут быть
- групповыми(длина,ширина,высота), одиночными (вес, цвет)
- списковыми(тот же цвет: есть несколько четко заданных вариантов расцветки), строковыми(надпись сбоку, например), числовыми (тот же вес).
- общими для всей группы товаров(длина, ширина, высота), уникальными для конкретного товара(какая-то особенность)
У некоторых числовых свойств есть единицы измерения, например, метр, миллиметр, кг и так далее.
У этих единиц измерения есть возможные написания, в зависимости от числительного
1 минута, 2 минуты, 5 минут, а так же сокращенное написание: мин.
В итоге, у меня получается довольно громоздкая система таблиц:
catalog_groups
id, parent_id, path, title
catalog_items
id, group_id, title
catalog_group_parameters
id, id_group, type, value
catalog_parameters
parameter_id, item_id, value
catalog_list
list_id, id, value
catalog...
ну и так далее, все равно никто читать не будет.
Проблемы, которые не удалось решить:
Если есть общие величины, вроде высоты, которые распространяются на все-все, как их объединить в одну? При этом, скажем, цвет - это разные параметры, так как списки цветов разные для групп.
Получается, иногда в значении value для параметра у меня именно значение, а иногда - идентификатор списка.
В общем, как умные дяди и тети это организовывают?
Ответ
Вообще таблица видов свойств должна быть одна. На все группы. Т.е. цвет и высота - это два свойства, а не 2*количество групп. При этом у товаров будут те свойства, которые есть (пусть даже набор свойств у разных товаров одной группы будет отличаться). Далее для каждой группы должна быть развязочная таблица, что в этой группе есть такие-то свойства (т.е. group_id, parameter_id), по которым можно фильтровать. При этом значения для фильтра берутся distinct'ом (для диапазонов соответственно min/max) по значениям этого свойства для товаров в данной группе, т.е. список значений хранить не нужно, соответственно и разделять свойство "цвет" для разных групп нет смысла, лишние цвета в фильтр не попадут. Тогда проблемы с идентификаторами списков возникнуть не должно... N.B. Свойства делятся на: булевы (в плане выбора виджета - чекбокс, понятно что можно и радио и селект сделать на два элемента). числовые или дата (сравнение больше, меньше, диапазон) строковые (совпадение по строке, по подстроке) лукап (одно значение из списка возможных значений) множественный лукап (когда можно выбрать несколько значений: красные или синие) более сложные варианты типа по подстроке множественного лукапа (синие: "темно-синие", "светло-синие", "синие в белую полоску") или поиск по древовидному справочнике - в детях. зависит от причудливости справочников. Ну и для каждого варианта строится свой виджет в фильтре. ЗЫ Надеюсь правильно понял проблему.
Комментариев нет:
Отправить комментарий