Указание того, какие даты не включены , может уменьшить количество строк базы данных, но усложнит вычисления, запросы и отчеты.
Я бы перевернул его с ног на голову.
Иметь основную таблицу 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
Точные объединения совпадений определенно выполняются по индексу, если он доступен, в каждой СУБД, которую я проверял;диапазон совпадений, как во втором примере, я не уверен.Они, вероятно, в порядке с точки зрения производительности, если только вы не получите метрическую тонну данных.