一对多关系的历史表
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_code 列作为 FK。
- address_type是枚举,所以一个人可以有多种地址。 (例如住宅、账单、永久)
- 地址 记录与每个 address_type 可以单独更新(例如,可以更新账单地址而不更新居住地址)
问题:
需要维护“人”实体和“地址”实体的历史记录
除此之外,还需要一些机制(修订版或标识符)来确定 Person 和她所有 Address 在那个时间点的确切状态.
尝试过的方法:
如果我们使用邻接表来保存两个实体的历史记录,那么 person.getAddresses()
将提供很多额外的(历史)记录。
创建历史 table 可能会增加解决方案的复杂性。
如果 Person 和 Address tables 是单独版本化的,那么可以引入一个新的 table(比如 State)来保留这些版本,并且那个新的 table 的 id 会精确定位给定时间点的确切状态。
但是由于人-地址关系是一对多的,将所有地址的版本保存在一条记录中似乎不合适。
我想到的最终方法:
- 向人
添加独特的(person_code, revision)
- 将 地址 形式
(person_code)
的 FK 更改为 (person_code, revision)
- 在每次 Person 更新时,复制(使用新版本)所有 Address 条目 person_code
- 在系统中到处使用人修改
我们能否以某种方式避免第 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(如果需要一起查看)
我需要跟踪多个实体的版本历史记录,以便能够在其历史记录的任何给定时间点查看其所有属性的状态,包括它们的一对多关系。
实体和关系:
Person
+++++++++++
id
person_code
name
other
Address
+++++++++++
id
person_code
street
city
state
address_type
- Person和address是一对多的关系,使用person_code 列作为 FK。
- address_type是枚举,所以一个人可以有多种地址。 (例如住宅、账单、永久)
- 地址 记录与每个 address_type 可以单独更新(例如,可以更新账单地址而不更新居住地址)
问题:
需要维护“人”实体和“地址”实体的历史记录
除此之外,还需要一些机制(修订版或标识符)来确定 Person 和她所有 Address 在那个时间点的确切状态.
尝试过的方法:
如果我们使用邻接表来保存两个实体的历史记录,那么 person.getAddresses()
将提供很多额外的(历史)记录。
创建历史 table 可能会增加解决方案的复杂性。
如果 Person 和 Address tables 是单独版本化的,那么可以引入一个新的 table(比如 State)来保留这些版本,并且那个新的 table 的 id 会精确定位给定时间点的确切状态。 但是由于人-地址关系是一对多的,将所有地址的版本保存在一条记录中似乎不合适。
我想到的最终方法:
- 向人 添加独特的
- 将 地址 形式
(person_code)
的 FK 更改为(person_code, revision)
- 在每次 Person 更新时,复制(使用新版本)所有 Address 条目 person_code
- 在系统中到处使用人修改
(person_code, revision)
我们能否以某种方式避免第 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(如果需要一起查看)