Mysql 在网站系统的许多表中使用电子邮件地址作为主键是一种好的做法吗?
例如,在stackoverflow.com这样的网站上,使用电子邮件地址识别多个表中的用户是否是一种良好的做法 如果主键很长,比如说 瓦查尔(50) 甚至 瓦查尔(100)Mysql 在网站系统的许多表中使用电子邮件地址作为主键是一种好的做法吗?,mysql,database-design,primary-key,Mysql,Database Design,Primary Key,例如,在stackoverflow.com这样的网站上,使用电子邮件地址识别多个表中的用户是否是一种良好的做法 如果主键很长,比如说 瓦查尔(50) 甚至 瓦查尔(100) ?否。首先,如果同一用户问两个问题怎么办?如果电子邮件是主键,我们现在有一个PK冲突 其次,它甚至不应该是复合键的一部分。如果用户更改了他们的电子邮件地址怎么办?然后,需要在表中进行一系列难看的更改 第三,您应该只使用自动递增ID之类的东西。字符串(如电子邮件地址)效率极低 如果需要将问题与特定成员关联,请将memberID
?否。首先,如果同一用户问两个问题怎么办?如果电子邮件是主键,我们现在有一个PK冲突 其次,它甚至不应该是复合键的一部分。如果用户更改了他们的电子邮件地址怎么办?然后,需要在表中进行一系列难看的更改 第三,您应该只使用自动递增ID之类的东西。字符串(如电子邮件地址)效率极低 如果需要将问题与特定成员关联,请将
memberID
外键放入member
表中。答案表应该有自己的自动递增ID,在问题
表中有一个问题ID
外键,在成员
表中有一个成员ID
外键,代表提供答案的成员。等等
顺便说一下,您可能想了解,至少(3NF)。这不是胡闹,这只是很好的常识。不是真的。对于任何规模较大的数据集,最终都会浪费大量空间,并且在查询时会影响性能。此外,如果有人更改了他们的电子邮件(您可能允许也可能不允许),您必须在任何地方都更改它
一个唯一标识用户的代理键是一个更好的选择。这是Jay Pipes关于比较主键的int和char之间的差异的文章,可能有助于理解为什么应该使用整数。不,这是个坏主意。电子邮件会发生变化,字符串比较也相对昂贵。代理键是最好的。自然键用于教科书。自然键在我所见过的每一个系统上都造成了严重的问题。即使是国家身份证号码也不够唯一
如果您对列进行了正确的索引,大多数现代数据库(Oracle、Postgres、SQLServer)不会因为您加入电子邮件地址而过度惩罚您。如果您担心连接,请创建一个非规范化的物化视图,并在插入/更新时支付费用。除了不希望字符串作为表中主键的所有性能原因之外,还有几个非常具体的原因,特别是电子邮件不应被用作主键:
- 主键必须是唯一的。但是,规范化电子邮件地址很困难。在强制实现唯一性方面,您可能会遇到很多问题。(电子邮件地址区分大小写吗?是否忽略。或+内部电子邮件?如何比较非英语电子邮件?)
- 电子邮件是可识别个人身份的信息。将其用于任何目的都可能是一个安全和隐私问题。特别是如果你的一些用户不满13岁
- 电子邮件不是一成不变的,因此不应作为身份表示使用。因此,如果用户更改了他们的电子邮件,您必须a)更新所有表的主键,或者b)将旧电子邮件作为密钥进行维护,这使得使用电子邮件作为密钥一开始就毫无用处