【发布时间】:2015-02-17 20:47:17
【问题描述】:
我正在尝试对数据库中的对象层次结构(实际上是域组)进行建模。我决定使用闭包表,以便在查询层次结构时获得高度的灵活性。基本上,我的架构看起来像这样:
CREATE TABLE group (
id INT -- primary key
... -- other fields here
)
CREATE TABLE groupHierarchy (
idAncestor INT,
idGroup INT,
hierarchyLevel INT
)
因此,当一个 id 为 1 的组包含一个 id 为 2 的组,而该组又包含一个 id 为 3 的组时,我需要在 groupHierarchy 表中有以下行。
idAncestor idGroup hierarchyLevel
1 1 0
2 2 0
3 3 0
1 2 1
2 3 1
1 3 2
我也可以不使用 hierarchyLevels 为 0 的行(自引用)。
现在我想要一个映射到组表的 JPA 实体。我的问题是 - 管理 groupHierarchy 表的好方法是什么?
我已经考虑的是:
1) 将组层次结构映射为元素集合,例如:
@ElementCollection
@JoinTable(name = "groupHierarchy")
@MapKeyJoinColumn(name = "idAncestor")
@Column(name = "hierarchyLevel")
Map<Group, Integer> ancestors;
这需要完全在应用程序中处理层次结构,恐怕这会变得非常复杂。
2) 使应用程序不知道 hierarchyLevel 列,并使用触发器在数据库中处理它(添加记录时,检查父级是否已经有祖先,如果有,则添加任何其他所需的行。这也是0的hierarchyLevel会派上用场)。在我看来,数据库触发器会更简单,但我不确定这是否有利于整体可读性。
任何人都可以提出其他选择吗?或者也许指出我提到的解决方案的任何优点或缺点?
【问题讨论】:
标签: java sql-server jpa