2013-02-14 72 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