【问题标题】:History tables for one to many relationships一对多关系的历史表
【发布时间】:2021-03-13 17:33:28
【问题描述】:

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

实体和关系:

Person 
+++++++++++ 
id 
person_code 
name 
other 
Address
+++++++++++
id
person_code
street
city
state
address_type
  • Personaddress 具有一对多的关系,使用 person_code 列作为 FK。
  • address_type 是一个枚举,因此一个人可以拥有多种类型的地址。 (例如住宅、计费、永久)
  • 每个address_type地址记录可以单独更新(例如,可以在不更新住宅地址的情况下更新帐单地址)

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

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

如果 Person 和 Address 表分别进行版本控制,那么可以引入一个新表(比如 State)来保留这些版本,并且该新表的 id 将精确定位给定时间点的确切状态。 但是,由于 Person-Address 关系是一对多的,因此将所有地址的版本保留在一条记录中似乎是不合适的。

我想到的最终方法:

  1. 将唯一的(person_code, revision) 添加到人员
  2. 地址 的 FK 从 (person_code) 更改为 (person_code, revision)
  3. 在每个 Person 更新中,复制(使用新修订版)该 person_code 的所有 Address 条目
  4. 在系统各处使用Person修订版

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

请建议在这种情况下应该探索哪些其他方法。
谢谢。

【问题讨论】:

    标签: database entity-framework database-design one-to-many


    【解决方案1】:

    考虑

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

    (不要将人员属性放在上表中,听起来很奇怪)(以上存在,因此您可以保持地址表的引用完整性)

    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
    

    这将允许您的存档(历史)表...以及子表的引用完整性。

    您可以创建一个视图来连接 Person 和 PersonArchive 表(如果需要一起查看)

    【讨论】:

    • 我仍然需要存储信息,例如在给定交易中使用的人员和地址的修订版本,这如何解决该问题?
    • 因此,每当 Person 表有更新时,您都会将更新前的行“复制”到 PersonArchive 中。在 PersonArchive 和可选的 Ordinal (int) 列上添加一个 create-datesamp ..您可以为每个复制到 PersonArchive 的副本获得 max+1。
    • 我添加了几列来尝试说明我之前的评论
    • 当其中一个地址更新时,我是否会随着地址的修订而增加人员的修订??
    • 正确,从技术上讲,您可以只使用 create-datesamp....但我喜欢添加 version_ordinal...是的,这将增加 1、2、3 等.
    猜你喜欢
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多