2014-09-23 162 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的 关系。