用户有很多角色,角色有很多用户。
在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)??我能找到的每个例子都使用了多对多连接表的天真顺序主键生成。
答案 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的关系。