你会如何在SQL中建立一个时间多对多的关系?

时间:2009-02-05 18:06:48

标签: sql database-design sql-server-2008 temporal temporal-database

您如何在SQL中表示temporal多对多关系?在非时间环境下,人们可以使用junction table(也就是链接/桥/地图)来连接双方。

添加时间跟踪就像在联结表上包含ValidStart和ValidEnd列一样简单吗?如果你这样做了,你遇到了什么问题(如果有的话)?在这种关系中,有没有更好的方法来跟踪一段时间内的变化?

如果它有帮助,在我的情况下,我专门使用SQL 2008,时态数据不是bitemporal,因为我只跟踪有效时间。

1 个答案:

答案 0 :(得分:5)

我正在研究一个项目(现在已经有几年了),它同时使用时态数据和时间多对多关系。每个表都有ValidFrom和ValidUntil列(仅存储日期)。

首先,您必须定义Valid *列的语义,即ValidUntil是否包含在有效范围内或从有效范围中排除。您还需要指定NULL日期是否有效以及它们的含义。

接下来你需要一些函数,比如dbo.Overlaps2()和dbo.Overlaps3()分别接收2和3个日期范围,如果日期范围重叠则返回1,否则返回0。

最重要的是,我为dbo.Overlap3(...)= 1定义了多对多关系的视图。

还有一点是有一组函数可以根据2或3个相关表中的日期计算有效有效范围。

最近,我不得不添加功能,允许用户显示所有可用数据,或仅显示当前有效数据。我将此设置保存在用户表中,在打开连接时将SPID与用户关联,并在另一组视图中过滤记录。