我的问题与Database Design for Revisions?有关,但更复杂。
我有两张表,它们之间有多对多的关系。我们称他们为A和B.
A: A.id, A.data, A.last_change_time
B: B.id, B.data
A_B: A_B.A_id, A_B.B_id, A_B.connected_since_time, A_B.some_status_enum
A_B连接器表必须支持修订。如果A中的元素与B中的元素之间的连接被删除,则必须保留之前存在的历史信息。如果连接状态发生变化,则必须保留旧状态的历史信息。
我需要生成的一些报告是:
我考虑过简单地将A_B.is_current布尔字段添加到连接表中。删除连接后,我只需将is_current设置为false。状态更改时,我将旧记录的is_current设置为false,并添加具有新状态的新记录。
对类似的先前提出的问题的回答经常声称“is_current”是糟糕的设计,应该有更好的解决方案。以前的解决方案谈到了单表中记录的修改而不是它们之间的关系。
使用is_current列来跟踪多对多连接的历史记录是错误的吗?如果错了可能会导致什么问题?什么是更好的解决方案?
答案 0 :(得分:1)
...通常
ValidFromDateTime
和ValidToDateTime
A_id, B_id, ValidFromDateTime
99991231
)当新修订发生时,您填充“当前行”的ValidToDateTime
并为ValidFromDateTime添加具有相同日期时间值的新行。或者,如果这是您的业务规则,则设置ValidToDateTime。
这为您提供任何时间点的状态等(或缺少)
您的查询非常简单
答案 1 :(得分:0)
我使用is_current
标志看到的主要问题是,一旦它们变得不是最新的,就无法确定哪些记录是最新的。我通常会添加一个日期字段,表示当前的开始日期。然后你的查询通常会抓住最新日期的行。