【发布时间】:2017-10-24 22:07:51
【问题描述】:
我遇到以下情况:我想将一张表中的多条记录与某种关系连接起来。记录可能与其他记录没有联系,或者可能有多个(1 个或多个)。这种关系没有层次结构。
例如:
CREATE TABLE x
(
x_id SERIAL NOT NULL PRIMARY KEY,
data VARCHAR(10) NOT NULL
);
我想到了两个想法:
- 在此表中创建一个新列,其中将包含一些关系 ID。它不会引用任何东西。插入新记录时,我将生成新的relationId 并将其放在那里。如果我想将其他记录与这条记录连接,我将简单地放置相同的relationId。
例子:
CREATE TABLE x
(
x_id NUMBER(19, 0) NOT NULL PRIMARY KEY,
data VARCHAR(10) NOT NULL,
relation_id NUMBER(19, 0) NOT NULL
);
insert into x values (nextval, 'blah', 1);
insert into x values (nextval, 'blah2', 1);
它将连接这两行。
优点:
- 非常简单
- 轻松查询以获取连接到特定记录的所有记录
- 没有开销
缺点:
-
hibernate 实体将只包含relationId,不包含 相关记录(或者也许有可能?)
- 制作一个单独的连接表,并以多对多关系连接行。连接表将包含两列带有 ID,因此一个条目将连接两行。
例子:
CREATE TABLE x
(
x_id SERIAL NOT NULL PRIMARY KEY,
data VARCHAR(10) NOT NULL
);
CREATE TABLE bridge_x
(
x_id1 NUMBER(19, 0) NOT NULL REFERENCES x (x_id),
x_id2 NUMBER(19, 0) NOT NULL REFERENCES x (x_id),
PRIMARY KEY(x_id1, x_id2)
);
insert into x values (1, 'blah');
insert into x values (2, 'blah2');
insert into bridge_x values (1, 2);
insert into bridge_x values (2, 1);
优点:
- 归一化关系
- 简单的休眠实体映射,包含相关的集合 记录
缺点:
- 开销(有多个连接的行,必须插入每一对)
最好的方法是什么?除了这两种方法还有其他方法吗?
【问题讨论】:
-
您能否更具体地说明允许哪些关系,哪些不允许?如果一行与其他行有多个连接,这是否意味着所有这些行都像一组一样相互连接? (例如,第 1 行、第 2 行、第 3 行是同一关系的一部分,它们不能是另一个关系的一部分)?
-
@AlexG,没错。行只能与一个或多个其他行存在一种关系。
-
您的第一个想法似乎不错。我认为您应该允许“null”,并且仅在需要时设置relationId。如果记录单独存在于其关系中,则保留记录的 relationshipId 是没有意义的。
-
@AlexG 是否有可能将休眠实体映射到 Set 中的相关行列表?
标签: sql oracle hibernate database-design