如何在MySQL中实现时态数据

时间:2015-07-06 18:18:41

标签: mysql database implementation temporal-database

我目前有一个非时态的MySQL数据库,需要将其更改为时态MySQL数据库。换句话说,为了报告目的,我需要能够保留随时间对记录所做的更改历史记录。

我实现这一点的第一个想法是简单地在表中插入而不是更新,当我需要选择数据时,只需在某些列上执行GROUP BY并按时间戳排序{{1} }。

然而,在考虑了一些事情之后,我意识到这会真的搞砸了,因为每个插入的主键(实际上只是模拟单个记录上的一些更新)将是不同的,因此混乱任何使用主键链接到数据库中其他记录的链接。

因此,我的下一个想法是继续更新数据库中的主表,但也创建一个新的插入到“审计表”中,它只是更新后的完整记录的副本,然后当我需要时为了报告时态数据,我可以使用审计表进行查询。

有人可以给我一些关于如何正确执行此操作的指导或链接吗? 谢谢。

2 个答案:

答案 0 :(得分:3)

使给定的表格R为时间(即保持历史记录)。

一种设计是保持表R不变,并使用valid_start_time和valid_end_time创建一个新表R_Hist。 有效时间是事实真实的时间。

CRUD操作可以如下:

插入

  • 插入两个R
  • 使用valid_end_time作为无穷大插入R_Hist

<强>更新

  • 在R
  • 中更新
  • 使用valid_end_time作为无穷大插入R_Hist
  • 使用“最新”元组的当前时间更新valid_end_time

删除

  • 从R
  • 删除
  • 使用“最新”元组的当前时间更新valid_end_time

选择

  • 从R中选择“快照”查询(隐式“最新'时间戳)
  • 从R_Hist中选择进行时间操作

相反,您可以选择为表R的每个属性设计新表。通过此特定设计,您可以捕获属性级时态数据,而不是先前设计中的实体级。 CRUD操作几乎相似。

答案 1 :(得分:1)

我做了一列Deleted和一列DeletedDate。删除的默认值为false,删除的日期为null。

IDColumn,Delete和DeletedDate上的复杂主键。

可以按删除索引,因此您可以进行真正的快速查询。

IDColumn上没有重复的主键,因为主键包含已删除和已删除的日期。

假设:您一次写入同一条记录的时间不会超过一毫秒。如果删除日期不是唯一的,则可能导致重复的主键问题。

因此,然后我进行更新的事务处理:选择行,获取结果,更新特定值,然后插入。确实是将其更新为now()的真正删除日期,然后在更新后将其吐出,并使用它来获取主键和/或所构建的任何API不可用的任何值。

不如临时表并且需要一定的纪律,但它会将历史记录构建到1个易于报告的表中。

我可能会开始更新删除日期列,并将其更改为添加日期之外的添加/删除列,以便我可以按1列(添加/删除列)对记录进行排序,而总是更新addBy列并设置相同的值作为用于日志记录的添加/删除列。

当addDate不为null时,这两种方法都可以做一个复杂的情况,否则AddedDate的命令将addDate作为addDate的顺序。所以,是的,无论如何,这行得通。