Sql 一个表的多行之间建立关系的正确方法

Sql 一个表的多行之间建立关系的正确方法,sql,oracle,hibernate,database-design,Sql,Oracle,Hibernate,Database Design,我有以下情况:我想用某种关系连接一个表中的多个记录。记录可能与其他记录没有连接,或者可能有多个记录(1个或多个)。此关系中没有层次结构 例如: CREATE TABLE x ( x_id SERIAL NOT NULL PRIMARY KEY, data VARCHAR(10) NOT NULL ); 我想到了两个想法: 在此表中创建一个新列,该列将包含一些relationId。它不会引用任何东西。当插入新记录时,我将生成新的relationId并将其放在那里。如果我想将其他记录与此记

我有以下情况:我想用某种关系连接一个表中的多个记录。记录可能与其他记录没有连接,或者可能有多个记录(1个或多个)。此关系中没有层次结构

例如:

CREATE TABLE x
(
  x_id SERIAL NOT NULL PRIMARY KEY,
  data VARCHAR(10) NOT NULL
);
我想到了两个想法:

在此表中创建一个新列,该列将包含一些relationId。它不会引用任何东西。当插入新记录时,我将生成新的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);
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);
它将连接这两行

优点:

很容易 轻松查询以获取连接到特定记录的所有记录 无开销 缺点:

hibernate实体将只包含relationId,不包含 相关记录,或者可能有什么原因

创建一个单独的联接表,并使用多对多关系连接行。联接表将包含两个ID为的列,因此一个条目将连接两行。 例如:

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);
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);
优点:

规范化关系 简单的hibernate实体映射,集合包含相关的 记录 缺点:

对于多个连接行,必须插入每一对
最好的方法是什么?除了这两种方法,还有其他方法吗?

根据我的经验,最好的方法是使用规范化,正如您在第二个选项中所说的那样。您在这里寻找的是创建一个

因此,如果您使用示例2中给出的示例,然后应用下面的SQL语句,您将创建一个关系数据库,它可以具有0到多个关系

ALTER TABLE `bridgex` ADD  CONSTRAINT `fk_1` FOREIGN KEY (`xID`) REFERENCES `x`(`xID`) ON DELETE NO ACTION ON UPDATE NO ACTION;

你能更具体地说明什么样的关系是允许的,什么是不允许的吗?如果一行与其他行有多个连接,是否意味着所有这些行都像一个集合一样相互连接?e、 g.第1排、第2排、第3排是同一段关系的一部分,它们不可能是另一段关系的一部分?@AlexG,没错。行只能与一个或多个其他行处于一个关系中。您的第一个想法似乎很好。我认为应该允许null,并且只在需要时设置relationId。如果记录的关系中只有一条记录,那么保留该记录的relationId是没有意义的。@AlexG是否有可能将hibernate实体映射到集合中的相关行列表?这真的是最佳选择吗?这种方法还有其他优点和缺点吗?个人是的,从你的问题来看,如果你想保持数据库的一致性,避免孤立数据,以确保表bridgeX中的x_id实际链接到表x中的x_id,这似乎就是你要找的。因此,使用我上面给你的外键,这将确保如果要从表X中删除记录,必须首先删除bridgeX中的所有记录。如果要删除表X中的一行,并删除表bridgeX中该行的所有关联数据,可以将外键更改为“删除时级联”。此外,这是一个可以详细了解外键优缺点的好地方。