2013-02-14 75 views
2

我想代表在RDBMS以下递归关系:递归实体瓦特/父/子关系

enter image description here

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

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) 
+----------+----------+ 

我应该如何接近非分层递归关系?

我应该继续并有意地复制每个元组,像第二个表中一样?还是有另一种方法,我是超视?

回答

1

我已经看过几次这种方法。从来没有一个真正的巨大粉丝,因为我不得不查询两个领域的比赛和过滤出重复的结果。那么超过2个相似的领域呢?会变得相当混乱。

使用上面的示例,另一种方法是引入一个SimilarField表。它会存储SimilarId和FieldId(有些人会争论第三个标识字段,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

+0

我可能会困惑(仍然),但我认为我需要多对多,而你的例子只允许文学有一个类似的领域。 *(我更新了我的问题中的例子)* – 2013-02-14 01:02:36

+0

@DavidKaczynski - 我非常肯定,使用这种方法,您可以在这方面建立N-N关系,但是在类似组中有1-N关系。请参阅上面的编辑。 – sgeddes 2013-02-14 01:16:11

+0

感谢您的澄清。请允许我问这个问题:如果我想获得所有类似于阅读的字段,该查询将如何查看?例如,'从SimilarField中选择SimilarId,FieldId,其中SimilarId = 3或FieldId = 3 ... ...但是,接下来如何将生成的[(SimilarId,FieldId)]元组转换为一组单独的Ids以查询原始Field表? – 2013-02-14 01:19:47

1

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