2010-04-29 66 views
1

我無法爲以下問題提出解決方案。數據庫設計 - 鏈接到沒有循環引用問題的父級

可以說我有一個分貝,看起來像下面這樣:

問題表

Id | Details | CreateDate | ClosedDate 

發行說明表

Id | ObjectId | Notes | NoteDate 

問題分配表

Id | ObjectId | AssignedToId| AssignedDate 

我想允許將問題鏈接到另一個問題。 我想添加一個名爲ParentIssueId的問題表中的列,這將允許我鏈接問題的能力,但是如果我通過這個實現,我預見問題表中發生循環引用。 有沒有更好的方法去做到這一點,如果是的話,如何?

感謝

回答

1

創建一個表:

LinkedIssues 
IssueIDa pk composite primary key, fk to Issue table 
IssueIDb pk composite primary key, fk to Issue table 

的PK會保留一些重複了,但創建一個檢查約束:

row 1 IssueIDa=123 
     IssueIDb=987 

row 2 IssueIDa=987 
     IssueIDb=123 

但是:IssueIDa<IssueIDb所以你不喜歡重複結束防止出現下面這樣的圈子:

row 1 IssueIDa=123 
     IssueIDb=987 

row 2 IssueIDa=987 
     IssueIDb=456 

row 3 IssueIDa=456 
     IssueIDb=123 

您需要一個觸發器來解析第e鏈,並且在一個圓上失敗。使用遞歸CTE將是檢測這個圓的最佳選擇。

+0

謝謝。我不太熟悉如何使用遞歸cte來創建觸發器來檢測這樣的圓。你有沒有任何例子或鏈接可以幫助我下右腳? – zSynopsis 2010-04-29 18:01:17

+0

試試這個:[Microsoft SQL Server:檢測循環引用。](http://database.itags.org/sql-server/80686/)或者:[在單個表中查找循環引用](http:// www。 sqlservercentral.com/scripts/Miscellaneous/30491/) – 2010-04-29 18:40:00

1

您可以添加一個連接/鏈路表,將是這個樣子:

IssueLink

IssueId | LinkedIssueId 

當兩列外鍵的問題表。

這將允許您任意鏈接問題以及允許使用父類型關係將單個問題鏈接到其他幾個問題。

你要穿上兩列的唯一索引,所以你不重複的數據結束了,也進行測試,以確保沒有條件像這樣:

IssueId & LinkedIssueId = LinkedIssueId & IssueId 

(這將導致邏輯​​重複)

看這裏:http://en.wikipedia.org/wiki/Junction_table 唯一的區別是,Junction表指向同一個表來創建一對多關係。

0

如果一個問題可能與另一個「父」問題有關,那麼在表中擁有一個「ParentId」列是好的(NULL表示沒有父親)。如果一個問題可能涉及多個其他問題,那麼將需要一個新的「多對多」(或「鏈接」)表。

或者的情況下,檢查和防止循環引用(特別是當「圓圈」包含三個或更多問題時)將是棘手的。您可以在UPDATE期間檢查循環,方法是在檢查循環引用的CTE上進行更新,如果找到任何更新,則更新失敗,或者您可以在首先檢查圓圈的存儲過程中進行更新,並且只會發出更新if支票通過。 (當然,您必須擔心併發問題 - 如果數據在您的支票和更新之間發生變化 - 如果更復雜,這使得基於CTE的更新更受歡迎。)