如何确保多对多关系表的唯一性?

时间:2014-09-23 23:53:36

标签: database join many-to-many

用户有很多角色,角色有很多用户。

在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)??我能找到的每个例子都使用了多对多连接表的天真顺序主键生成。

2 个答案:

答案 0 :(得分:1)

拥有顺序生成的USERS_ROLE_ID主键将无法保证USER_ID和ROLE_ID的唯一组合。在(USER_ID,ROLE_ID)上添加唯一索引将。

答案 1 :(得分:0)

Gerrat是对的。我在这里找到了完整的答案: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) )
     

请注意,我们已经删除了标识列,并且已经删除了   而是将复合(多列)主键定义为   CustomerID和ProductID列的组合。因此,我们这样做   不必创建额外的唯一约束。我们也没有   需要一个真正没有用处的额外标识列。我们   不仅在物理上简化了我们的数据模型,而且我们也是   使它更具逻辑性,是本表的主键   准确地解释了这张表正在建模的内容 -   CustomerID与ProductID的关系。