数据库行快照/修订

时间:2012-09-07 15:33:40

标签: database temporal-database

我正在寻找一个合适的流程来保存数据库中的行(及其关系)的修订或快照。

以电子商务平台为例 -

  • 客户创建订单。该订单与帐单邮寄地址和送货地址相关联。
  • 然后,客户在其个人资料中更改地址簿中的地址。
  • 原始订单的地址不应更改。

我看过几个概念,一个是重复的表,另一个是临时数据库,另一个是保留修订版ID和活动标记。

虽然我很感激没有人能真正告诉我最适合我应用的解决方案,因为这是一个容易接触的问题,我希望有人可能通过比较来证明优势/劣势。我已经阅读了很多关于SO的问题,以及关于各种实现的一些文章,但没有一个真正比较每个想法或指出它们最适合的地方。下面我概述了我对每个概念的理解。

重复表

将信息存储在与需要快照的数据相关的行中。即将地址保留在在线商店的订单表中的列中。

优点

  • 数据被分段为明确相关的表格,不需要加入等。
  • 无需按照以下概念中的要求仅选择活动行。
  • 假设行有时间戳,保留时态数据库的大部分好处

缺点

  • 复制
      模式的
    • (当多个表格修订时特别有问题)
    • 使用ORM时的模型。
    • 如果快照片段数据未更改并且已重新使用,则
    • 数据。即如果订单10次,则地址存储11次(订单+当前)
  • 处理插入相关表格所需的额外代码。

时间数据库/活动或当前行标志

“时间感知”的数据库行,即它们的上下文是两个日期时间之间的时间。数据可以在时间上下文位于时间表之间的地方加入。

优点

  • 没有架构或模型的重复。在一个地方进行的更改。
  • ORM模型可以处理新行的创建,无缝标记为活动等。
  • 不复制未进行任何更改的行。即10个订单到1个地址存储该地址一次。

缺点

  • 查询变得更复杂,因为连接/ where子句需要选择“活动”行。
  • 表格被历史数据堵塞,而这些数据未定期选择/调用。

仅存储已更改的列,即时间。

有一个表格,可以跟踪所有表格的变化,并记下与之相关的行以及它在时间方面的有效性。

优点

  • 根据未修复的未更改数据,在修订方面优化存储。

缺点

  • 将列的版本与其他数据相结合,查询要复杂得多。

我已经在SO和其他资源上查看了以下问题

编辑:我没有用特定的DBMS标记这篇文章的原因,因为我希望这个概念尽可能多地与平台一起工作,目前是DBMS独立的,抽象层允许它工作使用MySQL和MSSQL,但希望将来能够支持其他人。

2 个答案:

答案 0 :(得分:1)

我最终使用了一个时态数据库,而这个实现导致了Temporal Model中的FuelPHP

我现在可以配置我的模型将行视为时间敏感实体。更改会导致创建新行并相应地设置原始行的结束时间。

这允许我在某个时间点检索一行。

答案 1 :(得分:0)

还有另一个选项(至少在Oracle上)你可以设置时间点并运行你喜欢的任何查询。

我相信它可以使用大量的闪存恢复空间,但是如果你只想跟踪一些表,这可能会有点过分。