我是双时间世界的DB新手,并且有一个天真的问题。 假设您在两个表之间存在主卫星关系 - 其中主存储基本信息,而卫星存储仅与主表的少数记录相关的信息。示例将是'trade'作为主表,'trade_support'作为卫星表,其中'trade_support'将仅包含非电子交易的支持信息(将是少数人)。
在非双时态的情况下,我们会将其建模为亲子关系。我的问题是:在一个双时态世界中,这样一个用例是否仍然被建模为两个表的父子关系,两个表上有4个时间列?我没有看到无法完成的原因,但“我们应该这样做”的问题在我看来是非常模糊的。有没有大师帮我解决选择背后的理由?
优点:
缺点:
我认为这应该是一个非常常见的用例,并想知道是否有任何可以从中受益的最佳实践。
提前致谢!
答案 0 :(得分:1)
双时态数据管理和外键可能非常棘手。对于双时态表之间的主卫星关系,需要在主表中引入“人工密钥”,该“人工密钥”不是唯一的,但对于对象的不同时间或历史版本是相同的。该密钥是从卫星引用的。当连接两个表时,必须为连接提供双时间上下文(T_TIME,V_TIME),其中T_TIME是事务时间,V_TIME是有效时间。联接将类似于以下内容:
SELECT m.*, s.*
FROM master m
LEFT JOIN satellite s
ON m.key = s.master_key
AND <V_TIME> between s.valid_from and s.valid_to
AND <T_TIME> between s.t_from and s.t_to
WHERE <V_TIME> between m.valid_from and m.valid_to
AND <T_TIME> between m.t_from and m.t_to
在此查询中,有效期由列valid_from
和valid_to
给出,交易周期由列t_from
和t_to
给出。卫星表。主数据中的人工键由m.key
列和s.master_key
对此键的引用给出。左外连接也用于检索主表中那些卫星表中没有相应条目的条目。
如上所述,此连接条件可能很慢。 另一方面,这种布局可以更节省空间,因为如果仅更新主数据(在交易中)或仅更新卫星数据(在表trade_support中),则这将仅需要相应表中的新条目。将一个表用于所有数据时,需要为组合表中的所有列创建新条目。此外,您最终会得到一个包含许多空值的表。
所以你要问的问题归结为空间要求和简洁代码之间的权衡。使用单表解决方案牺牲的空间量取决于卫星表的列数。我可能会选择单表解决方案,因为它更容易理解。
如果您有机会切换数据库技术,面向文档的数据库可能更有意义。我已经编写了一个基于mongodb的双时态scala层的原型,可以在这里找到:
https://github.com/1123/bitemporaldb
这样您就可以在没有连接的情况下工作,并且可以使用更灵活的交易数据结构。