gpt4 book ai didi

java - 使用 Hibernate 进行分层数据版本控制的好的数据库设计是什么?

转载 作者:搜寻专家 更新时间:2023-10-30 20:41:17 24 4
gpt4 key购买 nike

我需要存储分层数据的更改历史记录。数据是一对多的关系:一个设置实体有很多属性。这是我的表格:

Setting
------------------------------
Id INTEGER NOT NULL
CompanyId INTEGER NOT NULL
Name TEXT NOT NULL


SettingProperty
------------------------------
SettingId INTEGER NOT NULL
PropertyName TEXT NOT NULL

我使用 Hibernate 作为 ORM,相应的 Java 实体看起来有点像这样

public class Setting {

private int id;
private int companyId;
private String name;

private Set<String> properties;
// ....
}

现在,无论何时更改设置名称或向设置添加属性,我都需要存储更改的完整历史记录。我还需要轻松查询给定时间点的历史设置。我考虑了多种不同的选择,即:

  1. 在“设置”表中添加一个“ChangeDate”列(告诉我们给定设置版本何时被修改)和一个“CommonId”列(告诉我们哪些实体及时形成了单个设置的历史 - 即以防万一当名称更改时,新设置版本具有新名称和新 ID,因此我们需要告诉它这只是同一设置的新版本)。这很简单,应该可以工作,但是很难查询大多数当前数据(即 SELECT * FROM Setting WHERE ChangeDate = (SELECT MAX(ChangeDate ...))
  2. 有一个只有一个 Id、一个 BLOB(用于保存整个序列化的 Java 设置对象)和一个 ChangeDate 的表。这样我只需要一个表就可以了,但是当我想在 Setting 对象中添加/删除一些东西时我就遇到了大麻烦,因为我需要更新已经保存的对象。
  3. 为上述每个表创建一个单独的历史表(具有相同的列和一个 ChangeDate)——这使得查询当前数据变得容易(只需使用常规表),但维护几个具有几乎相同架构的表是一些轻微疼痛。

有什么建议或更好的想法吗?请记住,我使用的是 Hibernate,因此并非所有 SQL 查询怪癖都是可能的。我的数据库是 PostgreSQL。

最佳答案

最终我们决定使用 Hibernate Envers因为它为我们做了所有的工作

所以我们将使用它为我们生成的任何映射表:)

关于java - 使用 Hibernate 进行分层数据版本控制的好的数据库设计是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19033348/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com