假设您有一个保险政策表,如
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
表中的记录,但这有点令人不安,因为它创建了一个循环引用。
这是一个糟糕的设计吗?有没有更好的办法?如果我走这条路,我将面临什么样的问题?
编辑:我应该更清楚 - 我不能认为最新的政策修订是“活跃的”。答案 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)。
一般来说,循环依赖不是一个好主意。