6

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

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

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

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

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

4

2 回答 2

11

使给定的表 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 操作几乎相似。

于 2017-04-28T07:04:32.173 回答
1

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

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

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

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

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

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

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

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

任何一种方式都可以只做一个复杂的情况,当不为 null as addedDate else addedDate as addedDate order by addedDate desc。所以,是的,无论如何,这行得通。

于 2019-02-05T16:41:02.327 回答