如何在 MySQL 中实现时态数据
How to implement temporal data in MySQL
我目前有一个非时间 MySQL 数据库,需要将其更改为时间 MySQL 数据库。换句话说,我需要能够保留随着时间的推移对记录所做的更改的历史记录,以用于报告目的。
我实现这个的第一个想法是简单地插入 table 而不是更新,当我需要 select 数据时,只需在 GROUP BY
某些列并按时间戳排序 DESC
.
然而,在稍微考虑一下之后,我意识到这真的会把事情搞砸,因为每个插入的主键(实际上只是模拟单个记录上的一些更新)将是不同的并且因此,将使用主键 link 的任何 linkage 弄乱到数据库中的其他记录。
因此,我的下一个想法是继续更新数据库中的主要 tables,但也创建一个新的插入到 "audit table" 中,它只是完整记录的副本更新,然后当我需要报告时间数据时,我可以使用审计 table 进行查询。
有人可以给我一些指导或 link 如何正确执行此操作吗?
谢谢。
使给定的 table R 暂时(即保持历史)。
一种设计是保留 table R 原样,并创建一个新的 table R_Hist valid_start_time 和 valid_end_time。
有效时间是事实为真的时间。
CRUD 操作可以表示为:
插入
- 同时插入两个 R
- 插入 R_Hist,valid_end_time 为无穷大
更新
- 在 R 中更新
- 插入 R_Hist,valid_end_time 为无穷大
- 用“最新”元组的当前时间更新valid_end_time
删除
- 从 R 中删除
- 用“最新”元组的当前时间更新valid_end_time
SELECT
- Select 来自 R 的“快照”查询(隐含的“最新”时间戳)
- Select 来自 R_Hist 用于时间操作
相反,您可以选择为 table R 的每个属性设计新的 table。通过这种特殊设计,您可以捕获属性级别的时间数据,而不是以前设计中的实体级别。 CRUD 操作几乎相似。
我做了一个列 Deleted 和一个列 DeletedDate。已删除默认为 false,删除日期为空。
IDColumn、Deleted 和 DeletedDate 上的复杂主键。
可以通过删除进行索引,这样您就可以进行真正快速的查询。
您的 IDColumn 上没有重复的主键,因为您的主键包含删除和删除日期。
假设:您不会在一毫秒内多次写入同一记录。如果删除日期不唯一,可能会导致重复主键问题。
然后我为更新执行交易类型交易:select 行,获取结果,更新特定值,然后插入。实际上,它是对删除的真实删除日期到 now() 的更新,然后你让它在更新后吐出该行并使用它来获取主键 and/or 任何对你构建的 API 不可用的值。
不如时间 table 并且需要一些纪律,但它将历史构建到 1 table 中,这很容易报告。
我可能会开始更新已删除的日期列,并将其更改为 added/Deleted 除了添加日期之外,这样我就可以按 1 列 added/deleted 列对记录进行排序,同时始终更新 addedBy 列为了记录,只需设置与 added/Deleted 列相同的值。
当 addedDate 不为 null 或 addedDate 为 addedDate order by AddedDate desc 时,任何一种方法都可以做一个复杂的情况。所以,是的,无论如何,这有效。
我目前有一个非时间 MySQL 数据库,需要将其更改为时间 MySQL 数据库。换句话说,我需要能够保留随着时间的推移对记录所做的更改的历史记录,以用于报告目的。
我实现这个的第一个想法是简单地插入 table 而不是更新,当我需要 select 数据时,只需在 GROUP BY
某些列并按时间戳排序 DESC
.
然而,在稍微考虑一下之后,我意识到这真的会把事情搞砸,因为每个插入的主键(实际上只是模拟单个记录上的一些更新)将是不同的并且因此,将使用主键 link 的任何 linkage 弄乱到数据库中的其他记录。
因此,我的下一个想法是继续更新数据库中的主要 tables,但也创建一个新的插入到 "audit table" 中,它只是完整记录的副本更新,然后当我需要报告时间数据时,我可以使用审计 table 进行查询。
有人可以给我一些指导或 link 如何正确执行此操作吗?
谢谢。
使给定的 table R 暂时(即保持历史)。
一种设计是保留 table R 原样,并创建一个新的 table R_Hist valid_start_time 和 valid_end_time。 有效时间是事实为真的时间。
CRUD 操作可以表示为:
插入
- 同时插入两个 R
- 插入 R_Hist,valid_end_time 为无穷大
更新
- 在 R 中更新
- 插入 R_Hist,valid_end_time 为无穷大
- 用“最新”元组的当前时间更新valid_end_time
删除
- 从 R 中删除
- 用“最新”元组的当前时间更新valid_end_time
SELECT
- Select 来自 R 的“快照”查询(隐含的“最新”时间戳)
- Select 来自 R_Hist 用于时间操作
相反,您可以选择为 table R 的每个属性设计新的 table。通过这种特殊设计,您可以捕获属性级别的时间数据,而不是以前设计中的实体级别。 CRUD 操作几乎相似。
我做了一个列 Deleted 和一个列 DeletedDate。已删除默认为 false,删除日期为空。
IDColumn、Deleted 和 DeletedDate 上的复杂主键。
可以通过删除进行索引,这样您就可以进行真正快速的查询。
您的 IDColumn 上没有重复的主键,因为您的主键包含删除和删除日期。
假设:您不会在一毫秒内多次写入同一记录。如果删除日期不唯一,可能会导致重复主键问题。
然后我为更新执行交易类型交易:select 行,获取结果,更新特定值,然后插入。实际上,它是对删除的真实删除日期到 now() 的更新,然后你让它在更新后吐出该行并使用它来获取主键 and/or 任何对你构建的 API 不可用的值。
不如时间 table 并且需要一些纪律,但它将历史构建到 1 table 中,这很容易报告。
我可能会开始更新已删除的日期列,并将其更改为 added/Deleted 除了添加日期之外,这样我就可以按 1 列 added/deleted 列对记录进行排序,同时始终更新 addedBy 列为了记录,只需设置与 added/Deleted 列相同的值。
当 addedDate 不为 null 或 addedDate 为 addedDate order by AddedDate desc 时,任何一种方法都可以做一个复杂的情况。所以,是的,无论如何,这有效。