【问题标题】:How to implement temporal data in MySQL如何在 MySQL 中实现时态数据
【发布时间】:2015-07-06 18:18:41
【问题描述】:

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

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

但是,在考虑了一下之后,我意识到这真的会让事情变得一团糟,因为每个插入的主键(实际上只是模拟单个记录上的多个更新)会不同,因此会变得一团糟建立任何使用主键链接到数据库中其他记录的链接。

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

谁能给我一些指导或链接如何正确地做到这一点?
谢谢。

【问题讨论】:

  • 一个典型的解决方案是创建一个新的审计表并使用触发器自动将其写入。方法包括复制完整的行状态,或者只是tracking which field was changed
  • 博士。 Richard Snodgrass 有一本关于这个主题的奇幻书,可在此处获得。 cs.arizona.edu/~rts/publications.html 可能比您希望的更多信息,但仍然是一流的材料。
  • 非常感谢你们。这就是我一直在寻找的。此外,奥利,在您链接到的页面上列出了几本书。你知道我应该特别看哪一个吗?谢谢。
  • 在 SQL 中开发面向时间的数据库应用程序。我认为是那个
  • 一位用户在stackoverflow.com/questions/8151064/… 提到这种方法可能难以在 MySQL 中实现。对此有什么想法吗?在使用 Oracle 的这种方法 15 年后,我即将踏上这条道路。

标签: mysql database implementation temporal-database


【解决方案1】:

使给定的表 R 是临时的(即,保持历史记录)。

一种设计是让表 R 保持原样,并使用 valid_start_time 和 valid_end_time 创建一个新表 R_Hist。 有效时间是事实成立的时间。

CRUD 操作可以表示为:

插入

  • 插入两个R
  • 插入到 R_Hist 中,valid_end_time 为无穷大

更新

  • R 中的更新
  • 插入到 R_Hist 中,valid_end_time 为无穷大
  • 将 valid_end_time 更新为“最新”元组的当前时间

删除

  • 从 R 中删除
  • 将 valid_end_time 更新为“最新”元组的当前时间

选择

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

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

【讨论】:

  • 这也是我得出的基本结论。我同意,拥有两张桌子是最好的方法。谢谢。
【解决方案2】:

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

IDColumn、Deleted 和 DeletedDate 上的复杂主键。

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

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

假设:您不会每毫秒对同一记录进行一次以上的写入。如果删除的日期不是唯一的,可能会导致重复的主键问题。

然后我对更新进行事务类型处理:选择行,获取结果,更新特定值,然后插入。实际上,它是对 now() 的已删除真正删除日期的更新,然后您让它在更新后吐出该行并使用它来获取主键和/或您构建的任何 API 不可用的任何值。

不如临时表好,需要一些纪律,但它将历史构建到一个易于报告的表中。

我可能会开始更新已删除的日期列并将其更改为添加/删除除了添加的日期,这样我就可以按 1 列、添加/删除的列对记录进行排序,同时始终更新 addedBy 列并设置相同的值作为记录的添加/删除列。

任何一种方法都可以在不为空时作为 addedDate 或者 addedDate 作为 addedDate order by addedDate desc 来执行复杂的情况。所以,是的,无论如何,这行得通。

【讨论】:

  • 不错的主意。我也开始在几乎所有数据库表中使用deleted_ondeleted_by 字段。效果很好。谢谢。
猜你喜欢
  • 2021-09-28
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 2022-07-13
  • 2022-07-28
  • 2021-02-05
  • 2018-01-22
相关资源
最近更新 更多