请确认我使用主键和唯一索引

时间:2011-11-07 15:32:34

标签: mysql indexing database-design null key

我想我理解主键和索引。

在我的设置中,我有一个包含多个列的表。其中两列是用户ID和用户名。 理想情况下,我希望两者都是独一无二的,并且不可为空。

据我所知,我最好的用途是将用户ID作为主键,因为这是最重要的字段而不是NULL,并且随着数据库的增长它永远不会改变。

然后我必须将用户名列作为唯一索引,以便它可以在另一行上相同,但不幸的是,可能最终为NULL。

这是我要做的事情,除非有办法让两个列都是唯一且非NULLABLE?

4 个答案:

答案 0 :(得分:4)

您可以将Username列声明为NOT NULL并在其上放置唯一索引。虽然索引本身不会强制非空值,但字段定义会,因此它实际上是一个唯一的非可空字段。

答案 1 :(得分:0)

从我的应用程序开发和数据仓库经验中,我建议使用一个单独的主键,该主键不用于任何业务设置,也不要使用用户ID作为主键。使用UserID作为主键可能会导致一系列问题。我会索引每一列(单独)。

如果您需要合并或重新分配用户或更改其ID等,实际使用其userID作为主键将导致这些操作出现许多问题。

此外,在网络上,这将打开人们看到像....user/1/details这样的网址,然后可能将“1”更改为“2”(例如)并查看其他人信息。如果ID是'57489574389ghfjghfjghf'那么唯一,那就更好了,然后用它来破解网址就更难了。

在这里解释'自然'和'代理'键之间的选择:
http://www.agiledata.org/essays/keys.html

人们在这方面遇到的大多数问题都是针对边缘情况,例如合并和删除。这些通常是最初的低优先级,但对它们的关注将随着时间的推移而增长,并且设计不良的解决方案将开始崩溃(通常因为在数据质量被“识别”的时候,通常存在如此大量的'坏'数据,前进是站不住脚的 - 旧数据不能“修复”,如果没有这些规则很难引入与它们共存的新记录。这假设仍然需要更新旧记录的能力。

答案 2 :(得分:0)

Nop,很遗憾地说这两个帐户都不正确。

1)对所有事情都是正确的,除非PK可以改变,如果你想要它。

2)根据定义,唯一索引是唯一的,它不能重复。你的意思是一个普通的老索引,不是唯一的,可以重复。它的目的是加快查询,如果您经常按该字段过滤。否则最好不要使用它。

你想要什么:Column1 =主键(非空),Column2 =唯一索引(非空),正是你所说的,但现在你知道为什么它可以根据你的需要工作。

编辑:此外,似乎你在索引和非nullables之间进行了核心化。您可以使列不可为空,无论它是否为索引。

答案 3 :(得分:0)

完全同意Michael的说法,您的主键列不应包含任何有意义的数据,尤其是像userID。因此,您应该为PK添加另一列,并从序列中填充它。

同意Darhazer:你应该在userid和username字段上加上一个非空约束和唯一索引。