Продолжение: как смоделировать скидку на товары в базе данных? - PullRequest
4 голосов
/ 20 декабря 2011

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

Это в ответ на ответ на вопрос , который я спросил

Схема:

  • Product

    • productId
    • Имя
  • ProductPricing

    • productId (FK)
    • startDateTimeStamp
    • endDateTimeStamp
    • цена
    • оригинальная цена применима, только если мыиспользовать подход A (позже)

Данные:

Product:
    1   |   Apple
    2   |   Banana

T1: 21 декабря 2011 : сделок нетна этот раз

ProductPricing
    1   |   Dec 20, 2011, 00:00 |   Jan 1, 2038, 00:00  |   10$ |   10$
    2   |   Dec 20, 2011, 00:00 |   Jan 1, 2038, 00:00  |   20$ |   20$

T2: 24 декабря 2011 : Сделка!Примените скидку 25% на яблоки с 25 декабря, 14:00 - 26 декабря, 14: 00

Подход A. - Запрос обновляет цены на яблоки за указанный период времени

ProductPricing
    1   |   Dec 25, 2011, 14:00 |   Dec 26, 2011, 14:00 |   7.5$|   10$
    2   |   Dec 20, 2011, 00:00 |   Dec 25, 2038, 00:00 |   20$ |   20$

Подход B. - В запрос добавляется еще одна запись с ценами на яблоки за указанный промежуток времени

ProductPricing
    1   |   Dec 20, 2011, 00:00 |   Jan 1, 2038, 00:00  |   10$ |   10$
    2   |   Dec 20, 2011, 00:00 |   Dec 25, 2038, 00:00 |   20$ |   20$
    1   |   Dec 25, 2011, 14:00 |   Dec 26, 2011, 14:00 |   7.5$|   10$

T3: 27 декабря 2011 - Опции

Подход A. В настоящее время срок действия сделки истек, должен ли я сбросить endTimeStamp с помощью триггера?

Подход B. Должен ли я удалитьпоследняя запись о продукте, срок действия которого истек?

1 Ответ

7 голосов
/ 20 декабря 2011

Дизайн таблицы ProductPricing позволяет нам никогда не удалять старые данные о ценах (иногда руководству требуется отчет на основе этих данных).С тем, что вы описали выше, вы начнете так (я изменил начальную дату просто, чтобы было легко определить, что да, это была первоначальная цена, когда система начала действовать):

ProductPricing
   1   |    Jan 1, 1970, 00:00:00 |   Jan 1, 2038, 00:00:00  |   10$ |   10$

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

ProductPricing
   1   |    Jan 1, 1970, 00:00:00 |  Dec 20, 2011, 00:00:00  |   10$ |   10$
   1   |   Dec 20, 2011, 00:00:01 |  Dec 26, 2011, 00:00:00  |  7.5$ |   10$
   1   |   Dec 26, 2011, 00:00:01 |   Jan 1, 2038, 00:00:00  |   10$ |   10$

То, что мы сделали здесь:

  1. Обновите существующую запись с отметкой времени 2038, изменив поле endDateTimeStamp, чтобы отразить начало продажи
  2. Вставьте новую запись, чтобы определить продажу
  3. Вставьте другую новуюзапись для отражения нормальной цены снова

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

SELECT p.Name, pp.price, pp.original_price
FROM Product p
INNER JOIN ProductPricing pp ON pp.productId = p.productId
WHERE NOW() BETWEEN pp.startDateTimeStamp AND pp.endDateTimeStamp

даст вам список продуктов с текущими ценами.

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