双主控主卫关系

时间:2013-09-16 02:20:27

标签: temporal temporal-database

我是双时间世界的DB新手,并且有一个天真的问题。 假设您在两个表之间存在主卫星关系 - 其中主存储基本信息,而卫星存储仅与主表的少数记录相关的信息。示例将是'trade'作为主表,'trade_support'作为卫星表,其中'trade_support'将仅包含非电子交易的支持信息(将是少数人)。

在非双时态的情况下,我们会将其建模为亲子关系。我的问题是:在一个双时态世界中,这样一个用例是否仍然被建模为两个表的父子关系,两个表上有4个时间列?我没有看到无法完成的原因,但“我们应该这样做”的问题在我看来是非常模糊的。有没有大师帮我解决选择背后的理由?

优点:

  1. 正常化
  2. 缺点:

    1. 通过DAO维护和管理的附加表和时间列
    2. 定义高性能连接条件
    3. 我认为这应该是一个非常常见的用例,并想知道是否有任何可以从中受益的最佳实践。

      提前致谢!

1 个答案:

答案 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_fromvalid_to给出,交易周期由列t_fromt_to给出。卫星表。主数据中的人工键由m.key列和s.master_key对此键的引用给出。左外连接也用于检索主表中那些卫星表中没有相应条目的条目。

如上所述,此连接条件可能很慢。 另一方面,这种布局可以更节省空间,因为如果仅更新主数据(在交易中)或仅更新卫星数据(在表trade_support中),则这将仅需要相应表中的新条目。将一个表用于所有数据时,需要为组合表中的所有列创建新条目。此外,您最终会得到一个包含许多空值的表。

所以你要问的问题归结为空间要求和简洁代码之间的权衡。使用单表解决方案牺牲的空间量取决于卫星表的列数。我可能会选择单表解决方案,因为它更容易理解。

如果您有机会切换数据库技术,面向文档的数据库可能更有意义。我已经编写了一个基于mongodb的双时态scala层的原型,可以在这里找到:

https://github.com/1123/bitemporaldb

这样您就可以在没有连接的情况下工作,并且可以使用更灵活的交易数据结构。