Какую модель отношений использовать для хранения значения, которое зависит от других значений? - PullRequest
0 голосов
/ 01 апреля 2019

Задание, которое я получил:

Реализация функции скидок на товары, при которой размер скидки зависит от различных условий, например:

  1. Размер скидки зависит от категории продукта (телефон, телевизор, компьютер);
  2. Размер скидки зависит от производителя продукта (Apple, Samsung, Sony);
  3. Размер скидки зависит от типа клиента (Зарегистрированный / Гость);
  4. и т.д.

Предположим, что нам нужно покрыть только первое условие, когда сумма скидки на одного производителя - я думаю, что это чистый пример отношения 1 к 1, где для каждого производителя определена собственная скидка.

С точки зрения схемы БД эту часть можно легко реализовать двумя способами:

  1. Одна таблица MANUFACTURER_DISCOUNT с 2 столбцами: MANUFACTURER_NAME (тип ENUM) и DISCOUNT_AMOUNT (тип: LONG);
  2. или с двумя таблицами MANUFACTURER (MANUFACTURER_NAME, ID) и DISCOUNT (DISCOUNT_AMOUNT, MANUFACTURER_ID);

Но что мне делать в случае, когда у меня более 1 критерия (скидка на производителя)?

Как правильно построить структуру моих таблиц?

  • Нужно ли просто расширять таблицу, которую я описал как вариант 1, дополнительными столбцами, такими как PRODUCT_CATECORY, CUSTOMER_TYPE или, возможно, существует более элегантное и правильное решение?

1 Ответ

0 голосов
/ 01 апреля 2019

У каждой скидки должна быть своя таблица.

Тогда сумма скидки на запрос становится примерно такой:

SELECT IFNULL(cd.discount, 0) + IFNULL(md.discount, 0) + IFNULL(custd.discount, 0) as discount
FROM product p
LEFT JOIN category_discount cd
 ON p.category = cd.category
LEFT JOIN manufacturer_discount md
 ON p.manufacturer = md.manufacturer
LEFT JOIN customer_discount custd
 ON p.customer_type = custd.customer_type

Обратите внимание, что JOIN здесь важнее точного расчета скидки, просто помните, что NULL - это не найденное значение, и его необходимо учитывать.

Храните таблицы для одной цели. Установка нескольких типов скидок может привести к беспорядку, так как вам понадобится несколько строк. Несколько таблиц с однозначными отношениями также оказываются ненужным осложнением.

Если вы сомневаетесь в структурах таблиц, начните записывать запросы, необходимые для этих таблиц. Обычно становится очевидным, какая структура таблицы приводит к простым запросам в этот момент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...