Как моделировать скидку на предметы в базе данных?

Я создаю сайт электронной торговли и предлагаю скидки на определенные предметы в течение ограниченного времени.

Таблица My Product (MySQL) выглядит следующим образом:

Product
    - productId
    - Name
    - Weight
    - Price (price as on the cover of the item)

Должен ли я сделать другую таблицу для сделок:

Deals
 - dealID
 - productID (Foreign Key)
 - discount (fractional value: percentage)
 - description

Для извлечения элементов:

  • q1: Найти все продукты в продуктах с продуктомID = все идентификаторы продуктов в таблице сделок
  • q2: обновить цену со скидкой из таблицы сделок
  • q3: вернуть все продукты

Есть ли лучший способ сделать это? Кроме того, как мне обрабатывать дело, имеющееся в течение ограниченного времени?

EDIT: Я хотел бы показать, сколько скидок мы предлагаем для каждого продукта. Следовательно, мне нужно два значения на продукт, первоначальную цену и скидку на заданную продолжительность.

Я разместил решение для решения, предложенного crontab здесь

Ответ 1

Возможно, вы захотите добавить начальную временную метку и дату окончания в таблицу Deals. Таким образом, вы можете проверить, чтобы текущая дата находилась между датой начала и окончания сделки.

В таблице Deals не требуется dealID - ее можно ввести в ключ с помощью productID и даты начала скидки. Кроме того, в зависимости от того, насколько высокая цена может быть для данного элемента, не забудьте сделать поле discount чем-то достаточно точным (что-то вроде DECIMAL 12,8).

Если бы это был я, я бы фактически оставил цену от таблицы Product и создал таблицу ProductPricing вместо создания таблицы Deals. Эта таблица ProductPricing будет состоять из productID и стартовой метки времени в качестве полей ключа, а затем также иметь временную метку окончания, чтобы указать, когда эта цена изменилась. И, конечно, цена предмета.

Ответ 2

Еще одна вещь, которую следует рассмотреть, - как вы моделируете ситуацию, когда нет скидки на данный предмет? Вы можете использовать шаблон Null Object здесь - в основном, когда продукт создается, вы также добавляете сделку на этот продукт с 0% скидкой и неограниченным время. Таким образом, вы можете упростить логику поиска продукта (нет внешних соединений в запросе, нет if для расчета цены).

Ответ 3

Я бы использовал десятичное число для столбца скидки.

цена * скидка = $amount off

цена - $amount off = цена в корзине

В течение ограниченного времени вы можете ввести столбец даты истечения срока действия и вернуть только те строки, которые не истекли.

Ответ 4

Я бы добавил discountPrice, discountPercentage, endDiscountDate в таблицу Product и создать историю дисконта таблицы для отслеживания скидок

Затем, когда вы не хотите присоединяться к таблице, вы можете выбрать правильную цену путем проверки endDiscountDate