数据库行快照/修订记录

9
我正在寻找一种适当的处理方式,以保留数据库中行(及其关系)的修订版本或快照。例如一个电子商务平台:顾客创建订单,该订单与账单地址和送货地址相关联。然后,该顾客在其个人资料的地址簿中更改地址。原始订单的地址不应更改。我已经研究了几个概念,其中之一是复制表,另一个是时间数据库,还有一个是保留修订 ID 和活动标志。虽然我知道没有人能真正告诉我最适合我的应用程序的最佳/最适合的解决方案,因为这是一个开放性的问题,但我希望有人能够通过比较来演示优缺点。我已经阅读了很多关于各种实现的问题和文章,但没有一个真正比较每个想法或指出它们最适合的地方。以下是我对每个概念的理解。
复制表 将信息存储在与需要进行快照的数据相关的行中。即在在线商店的订单表中保留地址列。
优点: - 数据被分段到明确相关的表中,无需连接等。 - 不需要选择所需的活动行,如下面的概念所述。 - 假设行有时间戳,则保留了大部分时间数据库的好处。
缺点: - 复制 - 模式(当多个表上一次修订时特别有问题) - 使用 ORM 时的模型。 - 数据,如果快照数据的某个部分未更改并且被重复使用。即,如果有10个订单,则地址存储11次(订单+当前)。
时间数据库/活动或当前行标志 "时间感知" 的数据库行,即它们的上下文是两个日期时间之间的时间。可以在时间表的时间上下文之间连接数据。
优点: - 不复制模式或模型。在一个地方进行更改。 - ORM 模型可以无缝处理创建新行、标记为活动等。 - 不会复制未更改的行。即,10个订单对应1个地址存储地址一次。
缺点: - 查询变得更加复杂,因为连接/where 子句需要选择“活动”行。 - 表变得拥挤,历史数据不经常被选择/调用。
仅存储更改列,时间感知。 有一个表跟踪所有表的更改,并记录其与何时有效相关的行。

优点

  • 在修订方面存储得到优化,因为未更改的数据不会被复制。

缺点

  • 查询结合版本和其他数据的列要复杂得多。

我已经查看了以下问题及其他资源:

编辑:我没有将此帖子标记为特定的DBMS,因为我希望这个概念能够尽可能地与多个系统一起使用。当前平台是独立于DBMS的,并且抽象层允许它与MySQL和MSSQL一起工作,但将来有希望支持其他DBMS。

2个回答

1
我最终使用了一个临时数据库,其实现结果是Temporal ModelFuelPHP中。
现在我可以配置我的模型将行视为时间敏感实体。更改会导致创建新行并相应地设置原始行的结束时间。
这使我能够在某个时间点检索一行。

0

另外还有一种选项(至少在Oracle上),你只需设置时间点,然后运行任何查询。

我认为它使用大量的闪回恢复空间,但如果你只对跟踪几个表感兴趣,那么这可能有些过度杀伤力了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接