@AndreyAndreevTM

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

Есть 3 таблицы:
  • Products
  • Categories
  • Discounts

Каждый продукт (Product) связан с одной категорией (category_id => id). Здесь всё понятно.
Каждая скидка (Discount) связана с одним или несколькими продуктами, с одной или несколькими категориями.

Вопрос: как их связать и где можно прочесть о шаблонах построения структуры БД?
  • Вопрос задан
  • 590 просмотров
Решения вопроса 1
Decadal
@Decadal
2a3494d97e3b34e05ebf5111ccb99102.png

Discounts нужно связать двумя "многие-ко-многим", это делается при помощи двух вспомогательных таблиц. Таким образом, у вас один Discount может
1) не иметь связи ни с товаром ни с категорией
2) быть связанным с множеством товаров
3) быть связанным с множеством категорий
4) быть связанным как с несколькими товарами, так и с несколькими категориями
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
webinar
@webinar
Учим yii: https://youtu.be/-WRMlGHLgRg
таблиц должно быть больше
Products
Categories
Discounts
Discounts_Products ( id | discount_id | product_id )
Discounts_Categories ( id | discount_id | categories_id)

Доки для связи через другую таблицу:
www.yiiframework.com/doc-2.0/guide-db-active-recor...
(искать "Relations via a Junction Table")

как вариант последние две можно заменить на 1, но по опыту геморойнее:
так d_p_c ( id | discount_id | product_id | category_id)
или даже так ( id | discount_id | related_item_id | related_item_classname)
Ответ написан
Комментировать
@d-stream
Готовые решения - не подаю, но...
Кстати стоит иметь в виду, что в реальной жизни зачастую "скидка на скидку" неприменимо.
Посему лучше заблаговременно подойти к "правилам скидок".

Как один из вариантов:
1. таблица групп(категорий) скидок rules_groups (id, descr, [ordering])
2. таблица "правил применения скидок" rules(id, group_id, descr, ordering, percent [условия])

Подразумевается что из каждой группы может быть применено одно правило (первое по порядку).
тогда соответственно (упрощенно)

select top 1 percent from rules where group_id=xx and (кучка условий на соответствие правилу) ORDER BY ordering

притом колонок условий для правил может быть множество и оно легко расширяемо. Навскидку от общих типа категорий, товарных групп, цветов, остатков/запасов/оборота, ABC классификации и т.п., заканчивая сроками истечения годности, количеством и даже данными контрагента, его группы и категории.

По вкусу можно на уровне групп или правил предусмотреть признак мультипликативная (умножение на коэффициент) это скидка или аддитивная (вычитание суммы) и "за единицу" или "за партию".
Ну и с учетом танцев с финокруглениями на тему НДС - неплохо иметь признак "С НДС"/"Без НДС" (но это подразумевает ньюансы хранения цен.

Еще элементом тюнинга будут флаги или коэффиценты на предмет применять ли правило при снижении отпускной цены ниже себестоимости"
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы