Database-Design
為有客戶的使用者正確的數據模型
我有一個應用程序,使用者被授予訪問權限。系統的一部分允許使用者擁有自己的“客戶”。
我有一個使用者表
******************************** users ******************************** PK user_id int username string password string(salted) ********************************
和客戶表
******************************** clients ******************************** PK client_id int FK user_id int username string password string(salted) ********************************
我想要的是每個使用者都應該能夠擁有一個同名的客戶端。這種情況可能是兩個人選擇使用不同的使用者,但偶然選擇了相同的使用者名。因此,clients 表中的使用者名可以有多個條目,但針對不同的 user_id。
我遇到的問題是,雖然使用者名欄位在客戶端表中不是唯一的,但它對於每個 user_id 應該是唯一的,即一個使用者不能有兩個或多個具有相同使用者名的客戶端。
我將如何建模?
您可以在 Clients 表中跨 user_id 和 username 添加唯一索引,這將確保每個 user_id 使用者名只能出現一次。儘管您應該知道,如果 user_id 列可以為空,它也適用於沒有分配 user_id 的客戶端。
編輯
使用由 client_id、user_id 和使用者名組成的複合主鍵將無法滿足您的要求。這是因為添加了 client_id 使得分組是唯一的。以以下行為例:
client_id user_id username 1 1 John Doe 2 1 John Doe
如果您有所有 3 列的複合主鍵,則上述內容將被允許 - 但是,如果您只是在最後 2 列中添加了唯一索引,則上述內容將無效 - 這是您的預期結果。
您可以在最後兩列中添加複合主鍵,但這不是一個好的設計,因為它在嘗試引用客戶端時會增加額外的複雜性。更好的設計是將 client_id 保持為主並在最後 2 列中添加唯一索引。