2

我试图在 RDBMS 中表示以下递归关系:

在此处输入图像描述

作为一个基本示例,我们有以下字段:

1 - computer science
2 - computer engineering
3 - electrical engineering
4 - mathematics

我想将相似的领域相互联系起来。我可以使用第二个表将字段相互关联。理想情况下,我可以想象它看起来像这样:

+----------+----------+
| field1   | field2   |
+----------+----------+
|    4     |    1     | (math -> comp sci)
|    4     |    2     | (math -> comp eng)
|    4     |    3     | (math -> elect eng)
|    2     |    1     | (comp eng -> comp sci)
|    2     |    3     | (comp eng -> elect eng)
+----------+----------+

但是,如果键是 (field1, field2),我可以看到两个潜在问题:

  1. 元组可以重复,尽管是无序的
  2. 如果哪个字段在哪个列中不重要,它可能会使查询不必要地复杂化(正如sgeddes指出的那样,查询两个列并过滤掉重复项)

例如:

+----------+----------+
| field1   | field2   |
+----------+----------+
|    1     |    4     | (comp sci -> math)
|    4     |    3     | (math -> elect eng)
|    4     |    2     | (math -> comp eng)
|    3     |    4     | (elect eng -> math)
|    2     |    1     | (comp eng -> comp sci)
|    3     |    2     | (elect eng -> comp eng)
|    1     |    2     | (comp sci -> comp eng)
+----------+----------+

我应该如何处理非层次递归关系?

我是否应该继续故意复制每个元组,就像在第二个表中一样?还是我忽略了另一种方法?

4

2 回答 2

1

我已经多次看到这种方法。老实说,我从来都不是一个超级粉丝,因为我不得不查询两个字段的匹配项并过滤掉重复的结果。那么超过 2 个相似的字段呢?可能会变得相当混乱。

使用上面的示例,另一种方法是引入 SimilarField 表。它将存储 SimilarId 和 FieldId(有些人会争论第三个 Identity 字段,SimilarFieldId)。因此,如果英语和文学是相似的领域,那么您可以:

SimilarId   FieldId
1           1         (English)
1           2         (Literature)

这种方法允许您在字段与其相似字段之间建立 1-n 关系。

- 编辑 -

针对您的评论,不确定您的示例如何不起作用:

SimilarId   FieldId
1           1         (English)
1           2         (Literature)
1           3         (Reading)
2           2         (Literature)
2           4         (History)
3           4         (History)
3           5         (Art History)

您可以根据需要拥有尽可能多的分组相似字段。

例如,要获取与文学相关的所有字段,您的查询可能如下所示:

SELECT DISTINCT F.FieldId, F.FieldName
FROM Field F JOIN 
      SimilarField S ON F.FieldId = S.FieldId
WHERE S.SimilarId IN (
      SELECT SimilarId 
      FROM SimilarField
      WHERE FieldId = 2 
   )

这是一个示例SQL Fiddle

于 2013-02-14T00:39:58.250 回答
1

解决重复问题的一种常见方法是确保field1始终包含元组中的最低 id,并结合UNIQUE两列上的键。那么你的条件SELECT就可以了WHERE field1 = @id OR field2 = @id

于 2013-02-14T01:21:21.823 回答