我在研究项目中使用 MySQL 5.7和WB6.3 来设计 ER图。
当我尝试创建多对多关系时。默认情况下,MySQL会将两个表的主键标记为查找表中的主键。
是否真的需要将两个表中的主键作为查找表中的主键?
请参阅下图中的表格car_item
我已从红色(idcar,iditem)
中删除了主键。请告诉我他们是否需要PK
答案 0 :(得分:1)
(car_idcar, item_list_iditem_list)
应该有一个唯一键,但它不一定必须是主键。这样,您可以确保不在两个表中的相同行之间创建重复关系。
一个表只能有一个主键,而car_item
表已经有主键id_car_item
,因此该关系的外键也不能成为主键。但是可以有任意数量的唯一键。
一些纯粹主义者可能会说,如果有两个唯一键(主键也是一个唯一键),其中一个是多余的。在您的情况下,id_car_item
列可能不是必需的,因为在其他表中引用关系并不常见,关系表仅用于连接其他两个表。但事实并非如此。例如,用户表可能包含唯一的username
列(因为您不允许多个用户使用相同的名称),但也使用userid
个主键作为其他表中的外键(这允许重命名用户而不必更新所有外键)。一些数据库设计人员喜欢在每个表中都有一个自动增量列,因为它在用户界面应用程序中很有用。
答案 1 :(得分:0)
通常的做法是在一个实现多对多的表中使用复合主键。该密钥应包含多对多关系两侧的两个表的主键。
这种方法可以保证数据的一致性并消除重复。
在您的情况下,您应该为表car_item
定义一个由两个字段{ car_idcar, item_list_iditem_list }
组成的复合主键
不需要列id_car_item
,可以删除它,它可能是自动添加的,因为许多RDBMS默认添加代理PK。