Sql-Server

1 <-> 0..1(+) 的架構,許多相關但只有一個主

  • August 25, 2012

使用 SQL Server 2008 和 Entity Framework 中提供的工具,什麼是表示一對多關係的可靠方法,其中存在我需要強制執行的底層唯一關係?我的具體範例是一組發布了零個或多個文件的人,但只有一個是他們的主要. 這不一定是他們最新的。


這就是我正在嘗試的…

我可以在 personId 上強制執行從 DOCUMENT 到 PERSON 的關係,以及在復合鍵上從 PERSON 到 DOCUMENT 的關係,同時允許 primaryDocumentId 上的 null 嗎?我有點擔心這會給我的 ORM 帶來麻煩。

1. PERSON                       DOCUMENT
  personId unique        &lt;- -&gt; personId
  primaryDocumentId null    -&gt; documentId unique

這裡有一些其他的想法:

2. PERSON                    DOCUMENT
  personId unique        &lt;- personId
  primaryDocumentId null    documentId unique

這並不能防止將其他人的文件作為主要文件的人的不一致。這樣做的好處是,如果我願意,我可以通過刪除 null 來強制執行主文件。

3. PERSON             DOCUMENT with trigger
  personId unique &lt;- documentId unique
                     personId
                     isPrimary

這存在觸發器在某些情況下可能需要的搜尋/嵌套操作的問題。此外,到目前為止,我一直完全避免使用觸發器,並且更願意保持這種狀態,尤其是對於核心原理圖需求。

4. PERSON             DOCUMENT
  personId unique &lt;- documentId unique
                     personId
                     date unique

這很有趣,因為每個人本質上只有一個最舊/最新的文件。但是,這並不代表我在這種情況下的使用。

5. PERSON             DOCUMENT                          PRIMARYDOCUMENT
  personId unique &lt;- personId           / composite \  personId unique
                     documentId unique  \ relation  /  documentId

這看起來可能是正確的方法。我認為這是練習過的,但我以前從未見過。你見過任何與之相關的風險嗎?

或者有什麼其他建議?

嘗試過濾唯一索引,而不是觸發器。

CREATE UNIQUE INDEX ixOnePrimaryEach ON dbo.Document(PersonID)
WHERE IsPrimary = 1;

引用自:https://dba.stackexchange.com/questions/23122