Добрый день.
Поставлена задача спроектировать БД для доски объявлений на Laravel.
Основной вопрос возникает в том, как лучше хранить свойства категорий товаров.
У нас есть таблица с категориями, у каждой из этих категорий есть свой набор свойств.
Свойства имеют разный тип. Это может быть число, строка, вариант из списка и.т.д
Если у нас тип свойства - раскрывающийся список, нам надо как то хранить значения для этого свойства. Причем у разных категорий эти свойства будут разумеется разные.
Например, есть овощи, это главная категория.
У нее есть подкатегории, картофель, огурцы и т д и есть свойство сорт, у каждой из этих подразделов они разные.
Хранить это все разумеется можно различными способами, интересно, как делать это правильно, чтобы было максимально масштабируемо и удобно?
products
- id
- name
- category_id categories:
- id
- name
- parent_id (для внутренней иерархии) properties:
- id
- name
- category_id (может быть указана ссылка на группу товаров)
- value_type (ENUM: "string", "int", "boolean", "date", "list") list_values: (Заполняется для свойств с типом list)
- id
- property_id
- name prop_values:
- product_id
- property_id
- value (все пишем в строку, потом при получении преобразуем в нужный тип)
Благодарю, а какие плюсы и минусы подхода, при котором для свойств типа список создается дополнительная таблица? Я думал у таких свойств хранить сериализованный массив стандартных значений в таблице prop_values
fmx500, В том виде в каком я написал по большому счету наверное никакого, но если добавить в эту таблицу "id", то можно будет корректировать name(представление значения списка) без боязни потерять данные, поскольку в prop_values.value будет ссылка а не строковое представление. Думаю так было бы надежней и профессиональней.
fmx500, по сериализованному массиву сложно организовать поиск (по json - тоже достаточно неудобно), а если свойства в отдельной таблице, можно, например, предлагать юзеру объявления, у которых значение какого-то свойства совпадает со значением свойства просматриваемого объявления - достаточно простой sql-запрос.