Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql表设计两个主键vs一个主键_Mysql_Database Design - Fatal编程技术网

Mysql表设计两个主键vs一个主键

Mysql表设计两个主键vs一个主键,mysql,database-design,Mysql,Database Design,我想知道下面哪一个是更好的设计 我有这些桌子 users ID | NAME Categories ID | NAME 哪一个更好,这是: users_to_categories CAT_ID | USER_ID 在这种情况下,CAT_ID和USER_ID是主键 或一个主键 users_to_categories ID | CAT_ID | USER_ID 只有ID是主键我假设您试图在两个表之间创建多对多关系,第三个表名为Users\u to\u Categories。如果是这样,那么C

我想知道下面哪一个是更好的设计

我有这些桌子

users
ID | NAME

Categories
ID | NAME
哪一个更好,这是:

users_to_categories
CAT_ID | USER_ID
在这种情况下,CAT_ID和USER_ID是主键

或一个主键

users_to_categories
ID | CAT_ID | USER_ID

只有ID是主键

我假设您试图在两个表之间创建多对多关系,第三个表名为Users\u to\u Categories。如果是这样,那么CAT_ID和USER_ID将是指向用户和类别中主键的外键指针


尽管如此,我还是要参考本文()给出的答案。我同意这里给出的答案,说当CAT\u ID/用户\u ID组合可以作为主键本身时,创建新的自动递增主键实际上没有任何好处。

虽然两种设计都很好,但我建议使用一个字段作为键方法

进行查询更容易


如果要将某些详细信息记录从父表的标题更改为另一个,只需更改父外键即可。如果这有助于您进行搜索,则这两个术语并不表示“一个”主键或“多个”主键,因为一个表只能有一个主键。您正在寻找“合成”主键和“复合”主键之间的区别。两者都可以。使用单个ID更容易开发,因为它在插入、更新和删除上的编码更少。然而,它占用了更多的空间,增加了更多的开销,并且不是人们逻辑上搜索的关键。因此,在users_to_类别上设置ID的唯一真正原因是在进行更新时简化编码,这样就有了唯一的1列键。因此,这确实是一个关于开发简单性的选择。我将从报告和故障排除的角度告诉您,像这样的非智能键会引起额外的麻烦,因为您必须始终返回源表,
users\u to\u categories
表的存在只是为了表示
users
categories
表之间的关系,您不需要单独的字段来标识关系。如果您要“挂起关系中的其他表”,或者如果您要在两个表中的记录之间建立多个版本的关系,如果您明白我的意思,则会发生这种变化。对于另一个问题,有多个答案。其中一个答案提出了一个重要的警告。如果它纯粹是一个“链接”表,没有其他属性,那么复合键是合适的。但是,如果“link”表具有属性和/或其他表具有对“link”表的外键引用,那么单列代理键实际上可以提供一些优势。“复合键”和“代理键”方法都是可行的。只有当我确定不会有FK引用和属性(除了“内务管理”列)时,我才实现复合键