Database-Design
在避免循環引用的同時強制記錄的存在
我在為以下問題設計令人滿意的解決方案時遇到問題。
有兩個主要實體:
- 顧客
- 使用者
一個客戶可以有許多與之關聯的使用者。一個使用者可以與許多客戶相關聯。絕對是應該存在聯結表的多對多關係。
客戶必須至少有一個管理員使用者。這絕對是至關重要的。
出於多種原因,最好強制客戶和相應管理員帳戶的組合存在於聯結表中。例如:在列出客戶的使用者時,最好不必手動包含管理員使用者。
在以下設計中,連接表中可能不存在客戶和相應管理員的組合:
(忽略錯誤放置在“使用者”處的魚尾紋)
有沒有解決這個問題的好方法?
到目前為止,我提出的解決方案涉及引入循環引用,我認為這是不可取的。另一種選擇可能是採用這種設計並為使用者列表使用視圖。感覺是一種解決方法。
我的設計是否存在缺陷,或者這是關係數據庫的限制?
我認為可以通過在表中施加新的外鍵約束來解決您的問題:
User (UserId, UserOther) PK(UserId) Customer (CustomerId, CustomerOther, UserAdminId) PK(CustomerId) Customer_User (CustomerId, UserId), PK(CustomerId, UserId) In Customer_User: FK(CustomerId) REFERENCES Customer FK(UserID) REFERENCES User In Customer: FK(UserAdminId) REFERENCES User FK(CustomerId, UseAdminId) REFERENCES PK(Customer_User)
通過這種方式,您可以保證 a
Customer
具有有效User
的管理員身份,並且其中有一個元組Customer_User
對應於某個客戶的管理員。