rob*_*ert 225 sql database postgresql database-design
与自动递增数字相比,电子邮件地址是主要的不良候选人吗?
我们的Web应用程序需要电子邮件地址在系统中是唯一的.所以,我想过用电子邮件地址作为主键.但是我的同事建议字符串比较比整数比较慢.
是不是使用电子邮件作为主键的正当理由?
我们正在使用PostgreSQL
.
Sjo*_*erd 278
字符串比较比int比较慢.但是,如果您只是使用电子邮件地址从数据库中检索用户,则无关紧要.如果您有多个连接的复杂查询,这很重要.
如果将有关用户的信息存储在多个表中,则users表的外键将是电子邮件地址.这意味着您多次存储电子邮件地址.
HLG*_*GEM 175
我还要指出,电子邮件是创建一个独特领域的不好选择,有人甚至小企业共享一个电子邮件地址.和电话号码一样,电子邮件可以重复使用.Jsmith@somecompany.com可以很容易地属于约翰史密斯一年,而朱莉亚史密斯可以两年后.
电子邮件的另一个问题是它们经常变化.如果你加入其他表作为密钥,那么你将不得不更新其他表,当整个客户公司更改他们的电子邮件时,这可能会受到很大影响(我已经看到了).
Ste*_*owe 97
主键应该是唯一且不变的
电子邮件地址会像季节一样变化 可用作查找的辅助键,但主键的选择较差.
Jay*_*Jay 63
使用电子邮件地址作为主键的缺点:
在进行连接时更慢.
具有已发布外键的任何其他记录现在具有更大的值,占用更多磁盘空间.(考虑到今天的磁盘空间成本,这可能是一个微不足道的问题,除非记录现在需要更长的时间来阅读.请参阅#1.)
电子邮件地址可能会更改,这会强制更新使用此作为外键的所有记录.由于电子邮件地址不会经常发生变化,因此性能问题可能很小.更大的问题是你必须确保提供它.如果你必须编写代码,这是更多的工作,并引入了错误的可能性.如果您的数据库引擎支持"on update cascade",那么这是一个小问题.
使用电子邮件地址作为主键的优点:
您可以完全消除一些连接.如果您需要的"主记录"是电子邮件地址,那么使用抽象整数键,您必须进行连接才能检索它.如果密钥是电子邮件地址,那么您已经拥有它并且不需要加入.这对你有什么帮助取决于这种情况出现的频率.
当您进行即席查询时,人们很容易看到正在引用的主记录.在尝试跟踪数据问题时,这可能是一个很大的帮助.
你几乎肯定会需要电子邮件地址的索引,所以将它作为主键消除了一个索引,从而提高了插入的性能,因为它们现在只有一个索引要更新而不是两个.
在我的拙见中,无论如何,这都不是一个扣篮.我倾向于在实用的时候使用自然键,因为它们更容易使用,并且在大多数情况下缺点往往并不重要.
mer*_*ike 12
这很糟糕.假设某些电子邮件提供商破产.然后,用户将要更改他们的电子邮件.如果您使用电子邮件作为主键,则用户的所有外键都将复制该电子邮件,因此很难更改...
......我甚至还没有开始谈论性能方面的考虑.
xlt*_*ttj 12
我不知道这可能是您的设置中的问题,但根据您的RDBMS,列的值可能区分大小写.PostgreSQL的文件说:"如果你声明一个列UNIQUE或PRIMARY KEY,隐式生成指数是区分大小写的." 换句话说,如果你接受用户输入的表格与电子邮件作为主键搜索,用户提供了"John@Doe.com",你不会找到"john@doe.com".
Sim*_*olt 11
似乎没有人提到电子邮件地址可能被视为私有的可能问题.如果电子邮件地址是主键,则配置文件页面URL很可能看起来像..../Users/my@email.com
.如果您不想公开用户的电子邮件地址怎么办?您必须找到一些其他识别用户的方法,可能通过一个唯一的整数值来制作URL ..../Users/1
.然后你最终得到一个唯一的整数值.
在逻辑层面,电子邮件是自然密钥.在物理层面,假设您使用的是关系数据库,则自然键不适合作为主键.原因主要是其他人提到的性能问题.
因此,可以调整设计.自然键成为备用键(UNIQUE,NOT NULL),并使用代理/人工/技术键作为主键,在您的情况下可以是自动增量.
systempuntoout问道,
如果有人想要更改他的电子邮件地址怎么办?你打算改变所有的外键吗?
这就是级联的目的.
使用数字代理键作为主键的另一个原因与索引在您的平台中的工作方式有关.例如,在MySQL的InnoDB中,表中的所有索引都预先设置了主键,因此您希望PK尽可能小(对于速度和大小的清醒).与此相关的是,当主键按顺序存储时,InnoDB更快,并且字符串对此没有帮助.
使用字符串作为备用键时要考虑的另一件事是,使用您想要的实际字符串的哈希可能会更快,跳过某些字母的大写和小写的情况.(我实际上在这里找到了一个参考,以确认我刚才所说的内容;仍在寻找...)
是的,最好使用整数。您还可以将电子邮件列设置为唯一约束。
像这样:
CREATE TABLE myTable(
id integer primary key,
email text UNIQUE
);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
34491 次 |
最近记录: |