如何最好地表示单个表中的行之间的关系?

时间:2017-12-12 11:08:07

标签: sql database-design architecture

想象一下这样的数据结构:

CREATE TABLE SuppressionList (
  SuppressionListId int(11) NOT NULL,
  ListName varchar(45) DEFAULT NULL,
  PRIMARY KEY (`SuppressionListId`)
) 

INSERT INTO SuppressionList VALUES (1, 'MyFirstList');
INSERT INTO SuppressionList VALUES (2, 'MySecondList');
INSERT INTO SuppressionList VALUES (3, 'MyFirstListVariant');

在这种情况下,MyFirstList和MyFirstListVariant实际上是同一件事的不同风格。到目前为止,我们已经非常明确地告诉我们,要求是将它们视为不同的实体,并且它们之间的关系并不重要。接近释放,不可避免地,现在需要承认这种关系。

这不是一张大桌子,"变种"是一段文本,所以可能仅通过流控制对此进行编码。但显然我可以看到这是一场未来的噩梦,只是等待变大。我宁愿一劳永逸地把这个钉子钉在头上。

我对最简单解决方案的直觉是所有自引用列,所以:

CREATE TABLE SuppressionList (
  SuppressionListId int(11) NOT NULL,
  ListName varchar(45) DEFAULT NULL,
  RelatedListId int(11) NULL,
  PRIMARY KEY (`SuppressionListId`)
) 

INSERT INTO SuppressionList VALUES (1, 'MyFirstList', null);
INSERT INTO SuppressionList VALUES (2, 'MySecondList', null);
INSERT INTO SuppressionList VALUES (3, 'MyFirstListVariant', 1);

但那......在某种程度上感觉不对劲。当它作为初学者的ORM对象工作时,我可以看到它很尴尬。这是解决问题的明智方法吗?如果没有,哪个更好?

编辑:为了清楚起见,只会有一个"变种"每个列表 - 所以这永远不会成为一个合适的树,最坏的情况下,不会超过一个。

1 个答案:

答案 0 :(得分:1)

这种方法被广泛使用。然而,它确实导致了如何浏览数据的问题。

这里有什么不同之处在于,如果您只有1对1的数据结构,多对一的结构,以及需要遍历多少层数据(即MyFirstListVariant2将映射到ID 1或ID 3)< / p>

这将定义您是否有直接的父子关系,或祖父母,父,子(树)结构。

如果你有一个树结构,那么导航就会变得很复杂 - 通常是通过游标或迭代cte在SQL中完成的。两者都没有最好的性能。如果您可以向我们详细介绍您尝试实现的目标,那么我们可以根据您拥有的数据量以及打算如何使用它来提供更好的建议。

NB。发布为答案,因为我不会把所有这些都放到评论中。