Database-Design

在避免循環引用的同時強制記錄的存在

  • June 11, 2018

我在為以下問題設計令人滿意的解決方案時遇到問題。

有兩個主要實體:

  • 顧客
  • 使用者

一個客戶可以有許多與之關聯的使用者。一個使用者可以與許多客戶相關聯。絕對是應該存在聯結表的多對多關係。

客戶必須至少有一個管理員使用者。這絕對是至關重要的。

出於多種原因,最好強制客戶和相應管理員帳戶的組合存在於聯結表中。例如:在列出客戶的使用者時,最好不必手動包含管理員使用者。

在以下設計中,連接表中可能不存在客戶和相應管理員的組合:

數據模型

(忽略錯誤放置在“使用者”處的魚尾紋)

有沒有解決這個問題的好方法?

到目前為止,我提出的解決方案涉及引入循環引用,我認為這是不可取的。另一種選擇可能是採用這種設計並為使用者列表使用視圖。感覺是一種解決方法。

我的設計是否存在缺陷,或者這是關係數據庫的限制?

我認為可以通過在表中施加新的外鍵約束來解決您的問題:

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)

通過這種方式,您可以保證 aCustomer具有有效User的管理員身份,並且其中有一個元組Customer_User對應於某個客戶的管理員。

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