【问题标题】:Database design to track changes - w/ Hibernate用于跟踪更改的数据库设计 - 使用 Hibernate
【发布时间】:2012-03-06 20:45:12
【问题描述】:

大家好,我在数据库设计方面遇到了困难。正如您从我当前的设计中看到的那样,注册可以有多个 EmployerRegistration,而 EmployerRegistration 可以有多个 ClientRegistration。从这里开始很简单。用户每年都需要创建一个新的注册。

不幸的是,我需要能够跟踪更改/修正。可以更改注册信息(姓名、地址等)或客户注册信息(删除/添加客户或删除/添加雇主)。

我尝试了很多不同的设计,但到目前为止,没有什么感觉是“正确的”。跟踪注册表中的修改很容易,因为这会影响它上面的所有表。所有 id 都已更新。是对 ClientRegistration 表的更改让我陷入了循环。如您所见,我正在尝试一个版本列,但这对我没有多大帮助。使用 Hibernate,感觉每个修改后的客户端注册都需要它自己唯一的注册对象,但是为任何客户端注册修改创建一个全新的注册似乎并不正确/高效。

我已经为此奋斗了大约一个星期,因此我们将不胜感激。谢谢!

【问题讨论】:

    标签: java database hibernate database-design nhibernate-mapping


    【解决方案1】:

    您查看Hibernate Envers 了吗?它是 Hibernate 的自动版本控制插件。使跟踪对象更改的历史非常容易。它以 AOP 方式配置,因此您可以简单地注释您要审计的对象,让 Envers 处理细节:

    @Entity
    @Audited
    public class Person {
        @Id
        @GeneratedValue
        private int id;
    
        private String name;
    
        private String surname;
    
        @ManyToOne
        private Address address;
        ...
    }
    

    【讨论】:

    • 我觉得圣诞节快到了,我很高兴哈哈。 Hibernate 继续让我大吃一惊。
    • 是的,当我遇到这个图书馆时,我也有同样的感觉。
    【解决方案2】:

    您可以使用 Envers,它现在捆绑在 hibernate-core 中。 Check the docs

    【讨论】:

      【解决方案3】:

      您是否遇到过时态数据建模的概念?你可能想用谷歌搜索它。一种非常流行的时间建模技术是“有效日期”逻辑,在 Peoplesoft 中广泛使用。简而言之,它是这样的:

      系统中的每个表都会有这种设计模式:

          Table{
             Primary_key,
             effdt,
             effseq,
             other data,
             modified_ts
          };
      

      使用主键 effdt 和 effseq 将记录的多个版本“叠加”起来。 Effdt 只存储日期,而不是日期时间。 effseq (int) 用于在同一天存储多个更改。 modified_ts 存储数据更改的日期戳。

      表格中的数据如下所示:

      PrimaryKey1   2012-01-01  1  MyData1  MyData2
      PrimaryKey1   2012-02-01  1  MyData1  Change1
      PrimaryKey1   2012-02-01  2  Change2  Change1
      

      要从任何表中获取最新数据,您可以使用如下查询:

      select * from MyTable A
      where effdt = (select max(effdt) from MyTable where PrimaryKey = A.PrimaryKey)
      and effseq = (select max(effseq) from MyTable where PrimaryKey = A.PrimaryKey 
                                                                 and Effdt=A.EFfdt)
      

      会有帮助吗?

      【讨论】:

        猜你喜欢
        • 2018-12-02
        • 1970-01-01
        • 1970-01-01
        • 2014-09-29
        • 1970-01-01
        • 2019-05-01
        • 2010-12-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多