Как моделировать скидку на предметы в базе данных?
Я создаю сайт электронной торговли и предлагаю скидки на определенные предметы в течение ограниченного времени.
Таблица 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