2014-09-23 166 views
0

用戶有很多角色,角色有很多用戶。如何確保多對多關係表中的唯一性?

在USERS_ROLES表,有3列:USERS_ROLES_ID,USER_ID,ROLE_ID

一般USERS_ROLES_ID只是順序地產生。有人告訴我,它應該保證user_id和role_id交叉產品是唯一的,所以主鍵USERS_ROLES_ID實際上應該是USER_ID和ROLE_ID的某種組合。這通常如何完成? (例如,USER_ID *(這裏是大數字)+ ROLE_ID)?我能找到的每個示例都使用多對多連接表的天真連續主鍵生成。

回答

1

具有順序生成的USERS_ROLE_ID主鍵不保證USER_ID和ROLE_ID的唯一組合。在(USER_ID,ROLE_ID)上添加唯一索引。

0

傑拉德是對的。我找到完整的答案在這裏:http://weblogs.sqlteam.com/jeffs/archive/2007/08/23/composite_primary_keys.aspx

Create table CustomerProducts 
(
    Customer_ProductID int identity primary key, 
    CustomerID int references Customers(CustomerID) not null, 
    ProductID int references Products(ProductID) not null, 
    OrderLimit int not null 
) 

這是我在也許是最我已經多年來工作 與數據庫中看到。以這種方式設計桌子的原因是什麼?老實說,我不知道!我只能推測,這是因爲 缺乏對錶的真正主鍵的瞭解,並且 它可能不是一個標識,也可能是由多個列組成的 。正如我所提到的,似乎很多數據庫架構師都不知道這個事實。

考慮代替以下設計:

Create table CustomerProducts (
    CustomerID int references Customers(CustomerID) not null, 
    ProductID int references Products(ProductID) not null, 
    OrderLimit int not null, 
    Primary key (CustomerID, ProductID)) 
這裏

注意,我們排除了所有的標識列,並且具有 代替限定的複合(多列)主密鑰作爲客戶ID和產品ID的 組合列。因此,我們做 不必創建一個額外的唯一約束。我們也不需要 需要一個真正沒有用途的額外標識列。我們 不僅簡化了我們的數據模型物理上,但我們也 使它更合乎邏輯,這張表 的主鍵準確地解釋了這個表是什麼建模 - 一個CustomerID與ProductID的 關係。