Sql-Server
1 <-> 0..1(+) 的架構,許多相關但只有一個主
使用 SQL Server 2008 和 Entity Framework 中提供的工具,什麼是表示一對多關係的可靠方法,其中存在我需要強制執行的底層唯一關係?我的具體範例是一組發布了零個或多個文件的人,但只有一個是他們的主要. 這不一定是他們最新的。
這就是我正在嘗試的…
我可以在 personId 上強制執行從 DOCUMENT 到 PERSON 的關係,以及在復合鍵上從 PERSON 到 DOCUMENT 的關係,同時允許 primaryDocumentId 上的 null 嗎?我有點擔心這會給我的 ORM 帶來麻煩。
1. PERSON DOCUMENT personId unique <- -> personId primaryDocumentId null -> documentId unique
這裡有一些其他的想法:
2. PERSON DOCUMENT personId unique <- personId primaryDocumentId null documentId unique
這並不能防止將其他人的文件作為主要文件的人的不一致。這樣做的好處是,如果我願意,我可以通過刪除 null 來強制執行主文件。
3. PERSON DOCUMENT with trigger personId unique <- documentId unique personId isPrimary
這存在觸發器在某些情況下可能需要的搜尋/嵌套操作的問題。此外,到目前為止,我一直完全避免使用觸發器,並且更願意保持這種狀態,尤其是對於核心原理圖需求。
4. PERSON DOCUMENT personId unique <- documentId unique personId date unique
這很有趣,因為每個人本質上只有一個最舊/最新的文件。但是,這並不代表我在這種情況下的使用。
5. PERSON DOCUMENT PRIMARYDOCUMENT personId unique <- personId / composite \ personId unique documentId unique \ relation / documentId
這看起來可能是正確的方法。我認為這是練習過的,但我以前從未見過。你見過任何與之相關的風險嗎?
或者有什麼其他建議?
嘗試過濾唯一索引,而不是觸發器。
CREATE UNIQUE INDEX ixOnePrimaryEach ON dbo.Document(PersonID) WHERE IsPrimary = 1;