关系数据库设计 - 添加循环引用或不添加循环引用

时间:2015-01-16 21:22:43

标签: database-design relational-database

假设您有一个保险政策表,如

Policies
PolicyID | CustomerID
       1 |          1
       2 |          1
       3 |          2

您希望跟踪对每个策略所做的修订,因此您可以创建一个类似

的表
PolicyRevisions
PolicyRevisionID | PolicyID |     EFDT |     EXDT | RevisionDate
               1 |        1 | 1/1/2014 | 1/1/2015 |     1/1/2014
               2 |        2 | 1/1/2014 | 1/1/2015 |     1/1/2014
               3 |        3 | 1/1/2014 | 1/1/2015 |     1/1/2014
               4 |        1 | 1/1/2014 | 3/1/2015 |     5/5/2014

现在,如果您正在使用此数据构建应用程序,那么引用驱动应用程序的“活动”策略修订版是有意义的。我这样做的想法是在Policies表中创建一个ActiveRevisionID外键字段,该字段指向PolicyRevisions表中的记录,但这有点令人不安,因为它创建了一个循环引用。

这是一个糟糕的设计吗?有没有更好的办法?如果我走这条路,我将面临什么样的问题?

编辑:我应该更清楚 - 我不能认为最新的政策修订是“活跃的”。

1 个答案:

答案 0 :(得分:0)

这通常不是一个好主意,但可以做到。您必须使Policy表中的PolicyRevisionID可以为空,否则您无法添加策略,因为没有PolicyRevision。同样,您无法添加PolicyRevision,因为没有策略。为了解决这个问题,可以在Policy Nullable中使PolicyRevisionID成为可能,并且可以使用null PolicyRevisionID添加策略。

在这种情况下,我会向PolicyRevision添加一个名为Active的标志。准确的实施取决于您的域名的更多数据:您可以在策略的整个生命周期中使用不同的修订版本吗?例如政策1的修订版1在2014年1月1日至2014年7月31日期间有效,修订版2在2014年8月1日至2015年1月1日期间有效?如果是这样,您可以使用Active = true进行多次修订,并且必须以某种方式验证活动的修订版本是否重叠。

如果不是真的,并且只有一个是活动的,那么验证会更容易一些(可以通过触发器完成;当新值为True时,将该策略的所有其他修订版的值设置为false)。

一般来说,循环依赖不是一个好主意。