ERD 和 SQL 用于收集随时间变化的信息同时保留旧信息的数据库?

问题描述 投票:0回答:2

字段将被更新,但以前的信息需要保留在数据库中,以便我可以滚动浏览以前的信息以及当前的信息。

我如何为此制作 ERD?

我如何使用 MySQL 来做到这一点?

database-design relational-database erd
2个回答
1
投票

您要解决的问题称为数据版本控制,即跟踪数据的所有连续更改(注意:不要与数据库版本控制混淆,后者是关于管理数据库的不同版本)结构/方案)。

有很多设计可以解决这个问题,具体取决于您想要实现的目标以及您是否在访问最新版本和以前的版本之间做出了区别。举几个例子:

  • 一种方法是为每个要“历史化”的表添加有效时间戳(开始日期和结束日期)。当前版本没有结束日期,直到创建新版本为止。但正如您可以想象的那样,这对于主键来说并非没有后果(它必须包含版本鉴别器,即开始日期,这需要将它也包含到引用它的外键中并保持所有这些同步) 。当您需要特别注意关系的版本控制时,可以使用此方法(因为新版本需要更改其他表中的相关拖曳,即在那里创建较新的版本)。
  • 另一种方法是使用这种方法,但为每个表添加一个仅包含主键的主表,以及该主键当前有效行的版本 ID(开始日期)。这将有助于检索最后的版本,并且仍然保持原始表中的外键不变。仅当主键永远不会改变时,这才有效,但使关系更易于管理。整体一致性(即关联先前状态中的不同对象)需要使用时间戳作为版本 ID,并且需要一些额外的工作来关联正确的版本。
  • 另一种方法是仅在表中保留最新版本,并为每个表创建一个历史表:每次进行更改时,您都像往常一样更新表,并将新版本插入历史表中(更新前一版本的有效期结束)。当您大部分时间使用当前版本并且仅偶尔浏览过去的版本时,此方法非常实用。
  • 除了开始和结束日期,您还可以使用版本标识符(递增整数,插入行时从 1 开始,每次插入时递增),带或不带
    active
    标志。然而,如果有很多相关表,这通常使用起来会更复杂。

对于 ERD 来说,这并不奇怪:使用上面解释的附加实体(表)和属性(字段)来丰富您当前的图表。但通常情况下,历史化会使图表更难以阅读。


-1
投票

来自https://dev.to/zhiyueyi/design-a-table-to-keep-historical-changes-in-database-10fn, 解决方案#2,使用历史表,是合适的,因为信息不会经常更新(如果有的话)。

© www.soinside.com 2019 - 2024. All rights reserved.