@Dark_Dante

Как правильно спроектировань БД?

Здравствуйте. Подскажите по такому вопросу.
Есть много много товаров. Некоторые товары - аналоги, полные или частичные других.
Есть две таблицы. Таблица с этими товарами и таблица с брендами. Эти две таблицы связаны друг с другом через третью таблицу.
Мне надо сделать, чтобы по артикулу товара искало его замену или аналоги.
Я так понимаю надо сделать таблицу соотношений, где два поля - id_товара и id_его аналога
Допустим у товара с ID 1 есть три аналога - получается на один товар три записи. А у этого аналога в аналогах - товар с ID 1 и оставшиеся два товара. Уже 6 записей. В общем что то мне такое решение не нравится.
Может быть кто подскажет более элегантное решение?
  • Вопрос задан
  • 432 просмотра
Пригласить эксперта
Ответы на вопрос 3
dmitriylanets
@dmitriylanets
веб-разработчик
зря вы взяли делать интернет-магазин запчастей без должной подготовки
Ответ написан
Wolfnsex
@Wolfnsex Куратор тега Веб-разработка
Если не хочешь быть первым - не вставай в очередь!
Есть две таблицы. Таблица с этими товарами и таблица с брендами. Эти две таблицы связаны друг с другом через третью таблицу.

У вас один товар может иметь сразу несколько брендов?

Я так понимаю надо сделать таблицу соотношений, где два поля - id_товара и id_его аналога
Допустим у товара с ID 1 есть три аналога - получается на один товар три записи. А у этого аналога в аналогах - товар с ID 1 и оставшиеся два товара. Уже 6 записей. В общем что то мне такое решение не нравится.

В целом, это вполне нормальная практика, по крайней мере, с точки зрения логики. Например, "лампочка А", логически может быть заменена на "лампочка Б", но обратная замена может быть не целесообразной, по каким-то признакам. Так же, при таком раскладе Вы сможете сортировать вывод аналогов по степени "рекомендуемости" их применения, на каждый товар и так далее. Но, у этого подхода безусловно есть и недостатки, в частности, это избыточность данных, дополнительные телодвижения по добавлению аналогов в каждый товар, лишнее место на диске, раздувание БД и так далее.

Если же все товары между собой являются абсолютными аналогами друг-друга, есть альтернативный подход. Он заключается в том, что вы создаёте какую-то группу аналогов, например, в таблице analog_groups, каждая запись в которой = 1 группа аналогов. Далее, Вы указываете в товаре, к какой группе аналогов он принадлежит, это можно делать как по ID группы, так и по её заголовку (или любому другому параметру, который Вы к ней добавите) или по параметру id_группы_аналогов у любого другого товара, который в эту группу уже входит.

Особенности такого подхода:
а) Отсутствие избыточности данных
б) Все товары в одной группе аналогов всегда будут аналогами для всех остальных товаров в этой же группе
в) Нам не нужно будет делать множество одинаковых телодвижений, постоянно перелинковыая аналоги товаров друг у друга
г) Экономиться место на диске и не раздувается БД
д) Мы не можем выставить сортировку или приоритеты вывода аналогов для каждого отдельно товара без жестких костылей
Ответ написан
MaxDukov
@MaxDukov
впишусь в проект как SRE/DevOps.
сделайте поле "аналог" - и у всех аналогичных товаров заполняйте его одинаково.
выбираете товар - и все товары, у которых это поле совпадает с полем у первого товара.
Ответ написан
Ваш ответ на вопрос

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

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