Как бы вы создали временное отношение «многие ко многим» в SQL? - PullRequest
6 голосов
/ 05 февраля 2009

Как бы вы представили временное отношение «многие ко многим» в SQL? При невременных обстоятельствах можно использовать соединительную таблицу (она же ссылка / мост / карта) для соединения двух сторон.

Является ли добавление временного отслеживания столь же простым, как включение столбцов ValidStart и ValidEnd в соединительную таблицу? Если вы сделали это, с какими проблемами (если есть) вы столкнулись? Есть ли лучший способ для отслеживания изменений во времени в такого рода отношениях?

Если это вообще помогает, в моем случае я специально использую SQL 2008, а временные данные не битемпоральные , поскольку я отслеживаю только правильное время.

1 Ответ

5 голосов
/ 05 февраля 2009

Я работаю над проектом (уже несколько лет), который использует как временные данные, так и временные отношения «многие ко многим». В каждой таблице есть столбцы ValidFrom и ValidUntil (сохраняются только даты).

Сначала вы должны определить семантику столбцов Valid *, т. Е. Включен ли ValidUntil или исключен из диапазона допустимых значений. Вам также необходимо указать, действительны ли значения NULL и каково их значение.

Далее вам понадобится пара функций, таких как dbo.Overlaps2 () и dbo.Overlaps3 (), которые получают 2 и 3 диапазона дат соответственно и возвращают 1, если диапазоны дат перекрываются, и 0 в противном случае.

Кроме того, я определил представления для отношений «многие ко многим» с помощью dbo.Overlap3 (...) = 1.

Еще одним моментом является наличие набора функций, которые рассчитывают эффективный диапазон действия на основе дат в 2 или 3 связанных таблицах.

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

...