Database design 为来自多个表的历史数据设计表

Database design 为来自多个表的历史数据设计表,database-design,Database Design,我在不同的表中有不同类型的字段,这些字段需要作为历史数据进行版本控制。 最好的方法是什么? 我所做的是捕获一个级别的分组字段。 我将维护查找嵌套表,在这些表中,我指定将进行版本控制的字段类型,如下所示 历史数据表将是这样的 有没有更好的办法来处理这种情况?请记住,要进行版本控制的数据可能会有很大差异。我看到了两种方法 您可以为每个要保留历史记录的表维护一个历史记录孪生表。原始表将始终包含项目的最后/当前版本,而历史记录将包含历史版本。历史双表不能有主键,因为将有多个具有相同ID的行。您需要向原始

我在不同的表中有不同类型的字段,这些字段需要作为历史数据进行版本控制。 最好的方法是什么? 我所做的是捕获一个级别的分组字段。 我将维护查找嵌套表,在这些表中,我指定将进行版本控制的字段类型,如下所示

历史数据表将是这样的


有没有更好的办法来处理这种情况?请记住,要进行版本控制的数据可能会有很大差异。

我看到了两种方法

您可以为每个要保留历史记录的表维护一个历史记录孪生表。原始表将始终包含项目的最后/当前版本,而历史记录将包含历史版本。历史双表不能有主键,因为将有多个具有相同ID的行。您需要向原始表和历史双表添加两列。列的类型将为DATETIME,并将被称为VALID_FROM和VALID_TO。VALID_TO在原始表中为NULL,表示这是当前版本

您可以有一个包含以下列的全局历史记录表-表\列\ ID、值、有效\从、有效\到。TABLE_COLUMN_ID将是映射表中的外键,从中可以获得原始实体的名称和相应列的名称。列值的类型应为TEXT,而VALID_FROM/VALID_TO的类型应为DATETIME。与另一种方法一样,您需要在每个原始表中增加两列-VALID\u FROM/VALID\u来表示当前版本的有效期


第一种方法显然需要更多的空间,因为它保留了版本表的所有列。使用第二种方法可能会有点不舒服,尤其是当您需要进行太多的联接以获取所有版本化字段时。

ok您的意思是在第二种方法中,我们将主键作为Table\u cloumn\u ID+validfrom/Valid\u to?的组合。但是现在对于Table_cloumn_ID,值是什么?它是否是一个像表名所有者那样的联合Id,Id为1表\u克隆\u Id将是所有者\u 1?问题是,我的数据是可变的,所以在给定的时间,一家公司可以有2个所有者,在另一个给定的时间,它可以有4个所有者,所以从原始表映射ID不是我所看到的好方法。列table_column_ID是一个人工ID-因为与使用2列相比,使用整数会占用更少的空间改为表\u NAMEtext和列\u NAMEtext。您将有一个带有列ID的表历史映射,表名称、列名称和表列ID将是历史映射的外键。您将在触发器中填充表HISTORY_映射,触发器实际上执行历史存储。如果您想存储给定公司的4或2名所有者的ID,则值可以是JSON编码的文本。在文献中,我认为您可以找到称为SCD类型4的方法1和称为SCD类型2的方法2。见: