客户是电子邮件地址错误主要与自动递增的数字相比?

我们的 web 应用程序需要在系统中是唯一的电子邮件地址。因此,我认为使用电子邮件地址作为主键。但是我的同事建议,字符串比较将比整数比较慢。

它的有效理由不使用电子邮件作为主键?

我们使用PostgreSQL.

2010-09-27 13:12:21
问题评论:

主意味着什么?如果需要唯一的电子邮件地址然后它是一个键,并需要一个唯一约束。无论您决定要提升其是被主是任意的除非没有采取如此如优化差系统的实际原因。

如果要强制使用唯一的电子邮件地址您的数据库,然后创建一个列与一个唯一的索引,但不要将它用作主键。

如果某人想要更改其电子邮件地址 @robert?你们是否打算更改过的所有外键?

@onedaywhen-几乎任何差异,但主键将默认情况下,聚集,而是不唯一的索引。您仍要定义将默认的单个记录的查找键的主键、 唯一索引只是过多的普通索引强制列唯一性

@James Westgate: FYI,没有自动群集 PostgreSQL 没有这样的内容。主键是唯一索引中所有字段都都完全一样非 NULL 的磁盘上实现的。

回答:

字符串比较时比 int 比较慢。但是,这并不重要如果您只需检索用户从数据库中使用的电子邮件地址。它 does 重要如果您有多个联接使用复杂的查询。

如果在多个表存储有关用户的信息,向用户表的外键将该电子邮件地址。这意味着您在多次存储的电子邮件地址。

+ 1 的一提的是外键;这就是主要的问题

@Sjoerd︰ 问题不是尽管无疑是低效的但谁又会在乎关于硬驱空间今天,存储电子邮件地址多次。大多数企业不具有 google 的比例,这会很重要。问题是,不能更改以后,因为它是这两个主键和作为外键引用的电子邮件地址。

说任何关于硬驱空间的 @StefanSteiger 吗?您存储的任何内容都将占用 RAM 中的空间。

Sjoerd 和 @Stefa Steiger-你们是那么超︰ D

如果任何一个想知道是不,像我一样,GUID 键将等同于我认为电子邮件键。

我会还指出,电子邮件是不好的选择,以使的唯一字段,有个人和共享电子邮件地址的更小公司。又像电话号码电子邮件可以重新习惯。Jsmith@somecompany.com 可以很容易地属于三张一年期和 Julia 史密斯两年之后。

电子邮件的另一个问题是它们经常更改。如果您正加入到与其他表键,则您将需要更新其他表,也可以是相当多的性能,降低整个客户端公司改变其电子邮件时 (我曾见过发生这种情况。)

+ 1 的一提的是级联更新问题。That's 的朋友让朋友只能使用代理键;-) 的原因。

啊,我不像这一说法根本...代理键可以也是源的问题;是的应用程序将更为可靠,若要更改的业务和/或完整性规则,但是信息可能会丢失一些变得更容易和记录的身份变得不太清楚。所以我就建议规则的拇指在此处...

@onedaywhen 和 @jay,只是因为您认为它应是唯一的 doen't 使其唯一。是丈夫和妻子可以是不同的客户。只是因为您还没有遇到这种之前并不意味着它不会发生。我已经达到了它,它确实发生这是永远不应该允许电子邮件被认为是唯一的原因是否您认为它应该是或不。这是一种要求推回因为它本质上是错误。

@HLGEM︰ 我不想陷入无休止的参数,但不能说,建议的项不是唯一的基于 hypotheticals 不知道上下文。如从电话公司的角度来看,电话号码唯一地标识客户的定义。是的可以说,"但如果有两个或三个的人可能会回答时呼叫此号码?"但这并不相关。从电话公司的角度来看,根据定义这是一个客户。(续...)

(续)同样,如果您要构建一个系统,利用电子邮件通信,很大程度上而言可能是消息调度系统或通知转发系统,那么它很可能,根据定义,一个电子邮件地址唯一标识用户。如果多个用户共享该电子邮件地址,这是不相关。它们的单个消息目标,因此,它们是单个用户。"用户"和"客户"不需要进行"单个人类被"的同义词。

主键应当是唯一常数

像季节一样的电子邮件地址更改。有用的辅助键查找,但主键的一个好的选择。

良好的键属性,这就是应该是稳定但不是一定是不可变的。

@onedaywhen︰ 是 !否则为什么将 SQL 支持级联更新?

如果您有一个选择,,转的常量/不可变项;为您较少工作下一步;只是因为 SQL 支持级联更新,并不意味着它始终是一个好主意 !

@Vincent Malgrat:"级联更新...刹车 db 规范化"-我没有正确理解这一概念的规范化 !

@Vincent Malgrat︰ 感谢您的确认,没有确实正确理解这一概念的规范化。"您不应具有多个行上重复相同的信息",您真正的意思说"信息"? !复合键通常会涉及到多个行上重复显示的值。对于外键,值是引用而不是"重复",大的区别。单列域具有两个值 (例如是和否) 会在引用表中的多个行具有相同的值,如果它有三个或更多行。这是非常基本的东西 !

使用电子邮件地址作为主键的缺点︰

  1. 在进行连接时,速度较慢。

  2. 任何其他记录的已过帐的外键与现在有较大的值,占用了更多的磁盘空间。(今天在给定的磁盘空间的成本,这可能是一个微不足道的问题,除的范围内记录现在需要更长的阅读。请参见 #1。)

  3. 电子邮件地址可能会更改,这将强制使用此作为外键更新所有记录。不那么经常更改电子邮件地址,性能问题是次要的可能。更大的问题是,您需要确保为其提供。如果您必须编写的代码,这是更多的工作,并引入 bug 的可能性。如果您的数据库引擎支持"上更新级联",它是一个小问题。

使用电子邮件地址作为主键的优点︰

  1. 您可以以完全消除某些连接。如果您只需要从"主记录"的电子邮件地址,然后与抽象的整数键必须为此联接检索出来。如果项的电子邮件地址,然后已有并是不必要的联接。这可以帮助您任何取决于这种情况下提出的频率。

  2. 进行一些特殊的查询时,很容易对人类被看到正在引用哪个主记录。当想要跟踪的数据的问题,这可能是大有帮助。

  3. 几乎可以肯定需要索引上的电子邮件地址吗,以便使其主键消除了一个索引,从而提高插入性能,因为他们现在有一个索引,而不是两个更新。

我直言,不是 slam-dunk 两种方法。我倾向于更喜欢当一个实际不可用,因为它们只是易于使用,并且缺点往往不是这样,就算在大多数情况下使用自然键。

用于显示专业 + 1 和缺点。

有关注意的可变引用键 + 1 是 PITA

@Matthew IMHO 仍然 PITA。例如,假设设计国家表时没有引用它,没有 biggy,只有两个表,但是随着时间的推移它变得 20 每个表与成千上万的记录。一些与该参考一些没有。这样一个逻辑写入最终被成千上万个写操作,并不会使其对所有表因为有人忘记了一个引用时添加表。这是确切的事情给我 2 字符的国家代码表上我不骗你。

1 和 3 的优势是过早的优化,优势 2 是一个很小的优点,并完全克服通过任何有效的查询工具。

@Ash︰ 你的"optimizatin"和"过早优化"之间的区别。但是,好的按相同的原因,我曾看到过任何人说过早优化的所有缺点。所以其中的留下您?#2,我发现当试图执行 ad hoc 查询是主要困难时,多余的联接中键入。因此,可能需要多个连接,以获取易于理解的数据,记录通常具有多个外键。如果通过"相当不错的查询工具"您的意思是一个计算出您想要查看您告诉它不及神奇地联接为您的数据,我希望看到它的工作原理。

它是非常坏。假设一些电子邮件提供商停业了。用户然后将想要更改他们的电子邮件。如果您已经使用电子邮件作为主键,用户的所有外键将重复该 damn 相当麻烦,要更改的电子邮件...

...,我甚至还没有开始谈到性能注意事项。

如何更改电子邮件地址将导致那里重复项?除非用户 A 的更改他的电子邮件地址,然后用户 B 将改变他的电子邮件,因为用户 A 的旧值和您的更新不是按顺序必须相同。我想远程可能。

外键引用,按照定义,包含它所引用的行的主键值的值。换句话说,它将重复的主键的值。(因此,复制不通过更改值引起的。但改变是由于这样的重复,并强制该约束更难)。

+ 1 行"假设某些电子邮件提供商停业了。"

这不是一个问题。级联外键存在,若要解决此问题。如果用户更改了电子邮件,此更改将级联作用于所有使用它为外键的表。

@rafa,我保证您,如果您使用级联更新和整个提供商停业或更改它们的名称 (Yahoo.com 变成 HooYa.com)、 数据库的所有用户锁定小时和天也许在这通过系统级联。它是一个非常有效的问题 (和的原因为何使用级联更新,如果您有任何大量的数据和密钥很差的办法很可能会改变。)

内容来源于Stack Overflow Use email address as primary key?
请输入您的翻译

Use email address as primary key?

确认取消