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



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

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到1个数据结构,许多到一个结构,以及需要遍历多少层数据(即MyFirstlistVariant2映射到ID 1或ID 3)<)

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

如果您有树结构,则导航可能会变得复杂 - 通常在SQL中通过光标或迭代CTE完成。这两个表现都没有。如果您可以为我们提供有关您尝试实现的目标的更多详细信息,那么我们可以根据您拥有的数据以及您打算使用它的方式提出更好的建议。

nb。发布为答案,因为我不会将所有这些都评论。

最新更新