【发布时间】:2021-03-13 17:33:28
【问题描述】:
我需要跟踪多个实体的版本历史,以便能够查看其历史中任何给定点的所有属性的状态,包括它们的一对多关系。
实体和关系:
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的确切状态以及她在那个时间点的所有Address。
尝试的方法:
如果我们使用邻接表来保存两个实体的历史,那么person.getAddresses() 将提供很多额外的(历史)记录。
创建历史表可能会增加解决方案的复杂性。
如果 Person 和 Address 表分别进行版本控制,那么可以引入一个新表(比如 State)来保留这些版本,并且该新表的 id 将精确定位给定时间点的确切状态。 但是,由于 Person-Address 关系是一对多的,因此将所有地址的版本保留在一条记录中似乎是不合适的。
我想到的最终方法:
- 将唯一的
(person_code, revision)添加到人员 - 将 地址 的 FK 从
(person_code)更改为(person_code, revision) - 在每个 Person 更新中,复制(使用新修订版)该 person_code 的所有 Address 条目
- 在系统各处使用Person修订版
我们能否以某种方式避免第 1 步中不必要的重复。 3 ?
请建议在这种情况下应该探索哪些其他方法。
谢谢。
【问题讨论】:
标签: database entity-framework database-design one-to-many