Как разработать схему для периодов дат с исключениями? - PullRequest
0 голосов
/ 18 октября 2011

Сайт о специальных скидочных акциях.Каждое событие содержит период времени (точнее, даты), в течение которого оно действительно.Однако часто бывает ограничение, что сделка недействительна, скажем, по субботам и воскресеньям (или даже в определенный день).

В настоящее время мой грубый проект будет состоять из двух таблиц:

Событиетаблица хранит EventID, дату начала и окончания продолжительности и все другие вещи.

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

Кто-нибудь знает лучший шаблон для этого требования или возможную ловушку для моего дизайна?Это требование похоже на подмножество модели общего календаря, поскольку оно не требует бесконечных повторяющихся событий в будущем (т. Е. Каждое событие имеет определенную продолжительность).

ОБНОВЛЕНИЕ

Мой коллега предложил иметь таблицу периодов с датами начала и окончания.Если период находится между 1/7 января и 7 января (исключение составляет 3 января), таблица будет записывать: 1 января ~ 2 января, 4 января ~ 7 января.

Кто-нибудьзнать, лучше ли это, чем подход ответа, с точки зрения производительности SQL.Спасибо

1 Ответ

0 голосов
/ 18 октября 2011

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

Я бы перевернул его с ног на голову.

  • Иметь основную таблицу Event, в которой указаны первая и последняя дата события.

  • Также имеется таблица детализации EventDates, котораязаполняется всеми датами, когда событие доступно.

Использование этого подхода упрощает использование, особенно при написании запросов и отчетов.

Обновление

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

select ...
from sales
     inner join eventDates
     on sales.saleDate = eventDates.date

Если ваша таблица eventDatesиспользует даты начала и окончания, соединения становятся труднее записать:

select ...
from sales
     inner join eventDates
     on sales.saleDate >= eventDates.start and sales.SaleDate < eventDates.finish

Точные объединения совпадений определенно выполняются по индексу, если он доступен, в каждой СУБД, которую я проверял;диапазон совпадений, как во втором примере, я не уверен.Они, вероятно, в порядке с точки зрения производительности, если только вы не получите метрическую тонну данных.

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