Как структруировать БД?

Необходимо спроектировать структуру БД.
Есть некоторые категории товаров. Например категория «обувь». Она может быть разделена по полу «мужская» и «женская», по цвету и так далее. Пользователь программы, которая будет управлять этой БД, должен иметь следующие возможности:

  1. Просмотреть все товары, выбранной категории с параметрами. Например «обувь», только мужская, синего цвета;
  2. Добавить новую категорию в БД;
  3. Добавить новый товар;

Я вижу это так:
Одна таблица содержит список категорий. ID, имя и строка. Строка перечисляет возможные параметры. Например так: «пол = мужская/женская; цвет = зеленая/синяя/красная». Другие таблицы создаются для каждой категории и содержат сами параметры определенного товара. Программа загружает возможные варианты каждого параметра категории из первой таблицы, а потом из соответствующей ищет необходимые элементы.

Сойдет ли такой вариант, при небольших нагрузках? Если нет, подскажите как правильнее сделать.
  • Вопрос задан
  • 3278 просмотров
Пригласить эксперта
Ответы на вопрос 5
ilyaplot
@ilyaplot
PHP программист
Не думаю, что параметры стоит хранить в строке. Будет затруднительно выбрирать товары по параметрам.
Предлагаю вынести параметры в отдельную таблицу, в которой будут содержаться поля id, id товара, название параметра
Ответ написан
Melkij
@Melkij
PostgreSQL DBA
Таблица категорий: id, название, всё, что относится непосредственно к категории
Таблица товаров: id товара, прочее, касающееся именно товара, но не характеристик товара
Таблица характеристик: id, название, описание и т.д.
Таблица связей: id_товара, id_характеристики (составной PK), значение характеристики

Вроде ничего не забыл.
Ответ написан
vaniaPooh
@vaniaPooh
Прочитайте про нормальные формы БД (например, тема изложена в книге Роберта Шелдона по MySQL). Одно из требований нормализации — значения в столбцах должны быть атомарны (т.е. не более одного значения в столбце). Кроме этого значения должны зависеть только от первичного ключа (с большой вероятностью это ID строки в выбранной таблице) и не зависеть друг от друга (например, знак зодиака зависит от месяца в году). В общем почитайте. В этой же книжке дана рекомендация по проектированию БД.
Ответ написан
ksusha
@ksusha
Категории:
id название и т.п.

Характеристики
id | название | тип (чекбокс, список, текст, строка и т.п.) | варианты выбора, если есть, в каком-нить формате (json, к примеру)

Пример:
1 | Пол | list | [ «женский», «мужской» ]
2 | Цвет | list | [ «синий», «красный», «зеленый» ]

Это нужно для управления выводом формы редактирования/добавления товара какой-либо категории. В итоге у вас будет один и тот же код везде и не нужно заводить таблицу под каждую категорию отдельно. В данном случае ясно, что тип поля list, значит, это select либо группа радиобаттонов, к примеру. А варианты выбора распаковываются из json.

Товары
id | id категории | название…

Как я поняла, у вас товар попадает в одну категорию, значит, можно сделать один ко многим.

Связки:
id характеристики | id категории

Это чтобы было ясно какие поля для редактирования товара доступны в категории, и чтоб можно было привязать характеристику к нескольким категориям.

id товара | id характеристики | значение характеристики

Ну это понятно.

Таким образом, при добавлении категории юзер может сам добавить туда нужные характеристики (или выбрать из уже существующих) и сохранить. Ну а при добавлении товара в эту категорию отрисуется красивая формочка, где можно заполнить значения всех характеристик.
Ответ написан
dmitriev_dmitry
@dmitriev_dmitry
Вид характеристики: ИД_Вида_Характеристики, Наименование (Пол, Цвет, ...)

Значение характеристики: ИД_Значения_Характеристики, ИД_Вида_характеристики, Наименование (Пол: Мужской, Пол: Женский,...)

Набор характеристик: ИД_Набора_Характеристик, Наименование (Синяя мужская, Синяя женская, ...)

Состав набора характеристик: ИД_Набора_Характеристик, ИД_Значения_Характеристики (Синяя мужская / Синий, Синяя мужская / Мужской, ...)

Товар: ИД_Товара, ИД_Набора_Характеристик

Все возможные наборы характеристик лучше сгенерить заранее (пользователю об этом знать не обязательно — он работает только со значениями).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы