Database-Design

為有客戶的使用者正確的數據模型

  • February 19, 2013

我有一個應用程序,使用者被授予訪問權限。系統的一部分允許使用者擁有自己的“客戶”。

我有一個使用者表

********************************
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 列中添加唯一索引。

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