Mysql 为什么我们应该在用户表中有一个ID列?

Mysql 为什么我们应该在用户表中有一个ID列?,mysql,database,Mysql,Database,很明显,我们已经有了关于每个用户的另一个唯一信息,那就是用户名。那么,为什么我们需要为每个用户提供另一个独特的东西呢?为什么我们还要为每个用户设置一个id?如果省略id列会发生什么情况?使用数字id的一个原因是,在其上创建索引比在文本字段上创建索引更精简,从而减少了查找特定用户所需的索引大小和处理时间。另外,当交叉引用不同表中的用户(关系数据库)时,可以节省更少的字节。在我看来,每个表都应该有一个唯一的、自动递增的id 以下是一些实际原因。如果有重复的行,则可以轻松确定要删除的行。如果你想知道行

很明显,我们已经有了关于每个用户的另一个唯一信息,那就是用户名。那么,为什么我们需要为每个用户提供另一个独特的东西呢?为什么我们还要为每个用户设置一个id?如果省略id列会发生什么情况?

使用数字id的一个原因是,在其上创建索引比在文本字段上创建索引更精简,从而减少了查找特定用户所需的索引大小和处理时间。另外,当交叉引用不同表中的用户(关系数据库)时,可以节省更少的字节。

在我看来,每个表都应该有一个唯一的、自动递增的id

以下是一些实际原因。如果有重复的行,则可以轻松确定要删除的行。如果你想知道行的插入顺序,你可以在id中找到这些信息。对于用户来说,世界上不仅仅只有“John Smith”一词。id为外部引用提供密钥

最后,任何可能描述用户的东西——姓名、地址、电话号码、电子邮件地址——都可能随着时间的推移而改变。

im mysql我们有。

 1:Index fields 2:Unique fields and 3:PK fields.
index means pointable
unique means in a table must be one in all rows.
PK = index + unique
在一个表中,您可能有许多独特的字段,如
用户名或护照代码或电子邮件。

但您需要一个像ID这样的字段。它是唯一的,并且是索引(=PK)。第一个字段始终是一件事,永远不会改变,第二个字段是唯一的,第三个字段很简单(因为它通常是数字)。

此标识符称为。我链接的页面列出了优点和缺点

在实践中,我发现它们是有利的,因为即使是超级密钥数据也会随着时间的推移而改变(即,用户的电子邮件地址可能会改变,因此任何对应关系都必须改变),但代理密钥永远不需要为其标识的数据改变,因为其值对关系没有意义

JOIN
的角度来看,它也很好,因为它可以是一个比varchar键长更小的整数


我可以说,实际上我更喜欢使用它们。由于在开发过程中不断变化的需求,跨表使用的多个列主键或数据代表性超键必须在以后变得非唯一,这不是您想要处理的情况。即使您的用户名是唯一的,拥有一个额外的id列而不是使用varchar作为主键没有什么好处

  • 有些人更喜欢使用整型列作为主键,作为永远不需要更改的代理键,即使其他列可能会更改。虽然没有什么可以阻止自然主键也可以更改,但是您必须使用级联外键约束来确保相关表中的外键与任何此类更改同步更新

  • 主键是32位整数而不是varchar可以节省空间。在引用用户表的每个其他表中选择int或varchar外键列是一个很好的理由

  • 如果在索引的末尾添加新行,则插入主键索引比将它们楔入索引的中间更有效。MySQL表中的索引通常是B+树数据结构,您可以研究它们以了解它们的性能

  • 一些应用程序框架更喜欢这样的约定,即数据库中的每个表都有一个名为
    id
    的主键列,而不是使用自然键或复合键。遵循这些约定可以简化某些编程任务

这些问题都不是交易的破坏者。使用自然关键点也有一些好处:

  • 如果按用户名查找行比按id查找行更频繁,那么最好选择用户名作为主键,并利用InnoDB的索引组织存储。如果可能的话,使您的主键查找列成为主键,因为在InnoDB中主键查找效率更高(您应该在MySQL中使用InnoDB)

  • 正如您所注意到的,如果您已经对用户名有了唯一的约束,那么保留一个不需要的额外id列似乎是浪费存储空间

  • 使用自然键意味着外键包含人类可读的值,而不是任意整数id。这允许查询使用外键值,而不必重新连接到父表中的“实”值

关键是没有一条规则涵盖100%的案例。我经常建议您保持选项的开放性,甚至在单个数据库中使用自然键、复合键和代理键


我在书中的“需要ID”一章中介绍了代理密钥的一些问题。

+1。这是一个非常好的答案。在您发现确实需要代理主键之前,您并不真正需要代理主键(及其所有可取的方面:简单、不可变、唯一、匿名等),因为事实证明,先前选为主键的“候选键”缺少主键的一个真正重要的方面(当选定的主键不是真正唯一的,或者它不是真正不变的,或者它不是真正匿名的……为适应这种情况而进行更改的时间和精力过多,以及受到影响的下游系统……”理论上,理论和实践之间没有区别。在实践中,有区别。”--未知主键是32位整数而不是varchar可以节省空间,我不太相信这一点。早在这成为一个问题之前,您就遇到了其他可伸缩性问题。然而,框架假设PKs将是整数这一事实是一个很好的例子point@ConradFrix,存储差异可以是小的,也可以是大的,这取决于字符串的长度。还要考虑的不仅仅是