一对多关系的历史表

History tables for one to many relationships

我需要跟踪多个实体的版本历史记录,以便能够在其历史记录的任何给定时间点查看其所有属性的状态,包括它们的一对多关系。

实体和关系:

Person 
+++++++++++ 
id 
person_code 
name 
other 
Address
+++++++++++
id
person_code
street
city
state
address_type

问题:
需要维护“人”实体和“地址”实体的历史记录 除此之外,还需要一些机制(修订版或标识符)来确定 Person 和她所有 Address 在那个时间点的确切状态.

尝试过的方法:
如果我们使用邻接表来保存两个实体的历史记录,那么 person.getAddresses() 将提供很多额外的(历史)记录。 创建历史 table 可能会增加解决方案的复杂性。

如果 Person 和 Address tables 是单独版本化的,那么可以引入一个新的 table(比如 State)来保留这些版本,并且那个新的 table 的 id 会精确定位给定时间点的确切状态。 但是由于人-地址关系是一对多的,将所有地址的版本保存在一条记录中似乎不合适。

我想到的最终方法:

  1. 添加独特的(person_code, revision)
  2. 地址 形式 (person_code) 的 FK 更改为 (person_code, revision)
  3. 在每次 Person 更新时,复制(使用新版本)所有 Address 条目 person_code
  4. 在系统中到处使用修改

我们能否以某种方式避免第 1 步中不必要的重复? 3 ?

请建议在此场景中应探索哪些其他方法。
谢谢。

考虑

PersonSuper
+++++++++++ 
personsuper_key

(不要把 person 属性放在上面 table,听起来很奇怪)(上面存在所以你可以保持地址 tables 的引用完整性)

Person. (<<assumes "non historical) 
+++++++++++ 
person_key
personsuper_key FK
lastname
firstname

PersonArchive 
+++++++++++ 
personarchive_key
personsuper_key FK
person_key (the original value from Person.    person_key if you ever need that)
create_datestamp
version_ordinal
lastname
firstname

.....

Address. (<<assumes "non historical) 
+++++++++++ 
address_key
personsuper_key FK

AddressArchive 
+++++++++++ 
addressarchive_key
address_key (<< the original Address.address_key, just in case)
personsuper_key FK
create_datestamp
version_ordinal

这将允许您的存档(历史)tables...以及 child table.

的引用完整性

您可以创建一个视图来加入 Person 和 PersonArchive table(如果需要一起查看)