Джон Скит:
для выполнения расчетов. Что будет
замедлить что-либо возвращая
раз, а в частности будет больно
запросы с участием EventTask раз в
фильтр - например, найди мне все задачи
которые происходят между временами X и Y. "
Мне кажется, у вас уже есть это требование при написании базовых ограничений целостности данных, например что даты задачи события должны быть в пределах дат для самого события, например расширение вашей схемы в SQL DLL:
CREATE TABLE Event
(
EventID INTEGER NOT NULL PRIMARY KEY,
event_Start DATETIME NOT NULL,
event_Finish DATETIME NOT NULL,
CHECK (event_Start < event_Finish),
UNIQUE (event_Start, event_Finish, EventID)
)
CREATE TABLE EventTask
(
EventTaskID INTEGER NOT NULL PRIMARY KEY,
EventID INTEGER NOT NULL,
event_Start DATETIME NOT NULL,
event_Finish DATETIME NOT NULL,
FOREIGN KEY (event_Start, event_Finish, EventID)
REFERENCES Event (event_Start, event_Finish, EventID)
ON DELETE CASCADE
ON UPDATE CASCADE,
event_task_START DATETIME NOT NULL,
event_task_Finish DATETIME NOT NULL,
CHECK (event_task_Start < event_task_Finish),
CHECK (event_Start <= event_task_Start),
CHECK (event_Finish <= event_task_Finish)
);
Если задачи события являются последовательными, то вам также необходимо написать ограничение для предотвращения перекрывающихся периодов, и это может включать подзапрос (большинство продуктов SQL не поддерживают это ограничение CHECK
, например, в SQL Server вам потребуется прибегнуть к курку). Если вам приходилось пересчитывать смещения с использованием временных функций (DATEADD
и т. Д.), То производительность могла бы быть проблемой в среде с высокой активностью, не говоря уже о повышенной сложности кода SQL DLL.
По этим причинам я бы смоделировал периоды, используя пару данных начала и конца, как предложено в вашей спецификации.