Как бы вы создали Временную связь "Многие ко многим" в SQL?
-
21-08-2019 - |
Вопрос
Как бы вы представили временной отношение "многие ко многим" в SQL?При невременных обстоятельствах можно было бы использовать соединительный стол (он же ссылка / мост / карта) для соединения двух сторон.
Является ли добавление временного отслеживания таким же простым, как включение столбцов ValidStart и ValidEnd в таблицу соединений?Если вы сделали это, с какими проблемами (если таковые были) вы столкнулись?Есть ли лучший метод отслеживания изменений с течением времени в такого рода отношениях?
Если это вообще поможет, то в моем случае я специально использую SQL 2008, а временные данные - нет битемпоральный поскольку я отслеживаю только действительное время.
Решение
Я работаю над проектом (уже несколько лет), который использует как временные данные, так и временные отношения "многие ко многим".Каждая таблица содержит столбцы ValidFrom и ValidUntil (для хранения только дат).
Сначала вы должны определить семантику допустимых столбцов *, т.е.независимо от того, включен ValidUntil или исключен из диапазона действия.Вам также необходимо указать, являются ли НУЛЕВЫЕ даты допустимыми и каково их значение.
Далее вам понадобится пара функций, таких как dbo.Overlaps2() и dbo.Overlaps3(), который получает 2 и 3 диапазона дат соответственно и возвращает 1, если диапазоны дат перекрываются, и 0 в противном случае.
Кроме того, я определил представления для отношений "многие ко многим" с dbo.Overlap3 (...) = 1.
Еще одним моментом является наличие набора функций, которые вычисляют эффективный диапазон действия на основе дат в 2 или 3 связанных таблицах.
Недавно мне пришлось добавить функциональность, позволяющую пользователю отображать все доступные данные или только актуальные данные.Я сохраняю этот параметр в таблице users, связываю SPID с пользователем при открытии соединения и фильтрую записи в другом наборе представлений.