1

我所有的表都有Id某种类型的字段(UserId, PostId, FooId等)。我通常把它设为 Primary Key

我有一张桌子叫做Countries. 它有

CountryId SMALLINT
Name VARCHAR(100)  -- Yes, english country names only, in this column.
AndSomeOtherFields.

现在,我知道Name必须是独一无二的。所有国家名称都是唯一的。PrimaryKey如果我制作==CountryId ASC 和 , 它是好/坏/ru-rohName ASC吗?

如果它很好,有人可以解释为什么它更好,而不仅仅是IdPK?只是它确保了数据的完整性(例如,表中不存在两个国家名称)。如果不好..为什么?

非常感谢。

4

6 回答 6

6

制作主键CountryId Name不能确保名称是唯一的。它只是确保每个CountryId-Name 都是唯一的,并且显然CountryId已经是唯一的,是一个“ID”。因此,您仍然可以拥有,例如1-US19-US,因为这些对是唯一的。

将它们都设为主键的唯一原因是,如果您经常执行在 Where 子句中同时使用 CountryId 和 Name 的查询。默认情况下,主键创建一个聚集索引,该索引对表进行物理排序,因此它可以非常快速地根据这些谓词查找行。

要提出的另一个重点是,在您的特定示例中,您正在存储一个国家列表,该列表a)非常短,b)变化不大。无论您做什么,对该表的查找都将非常快。即使 SQL Server 每次都必须进行全表扫描,您也可能不会注意到。您不必担心页面碎片。您可以跳过 ID 列并将 用Name作主键。

或者,如果您想保留一个 ID,但也只强制国家名称的唯一性,您可以在名称列上放置一个唯一约束。

在一个答案中很难涵盖主键、聚集索引和一般索引的问题,过于深入。以下是一些很好的入门资源:

于 2009-04-14T01:48:52.863 回答
1

将名称变为 PK 并不总是最好的解决方案,我相信 CountryId 足以作为您表的 PK,但是如果 Name 是一个字段,您将使用它来查询 ie: selects,joins ,您应该索引这个字段以这种方式通过该字段进行查询过滤将大大提高它的速度

祝你好运 :)

于 2009-04-14T01:49:08.167 回答
1

在列上创建唯一索引Name

于 2009-04-14T01:56:20.023 回答
0

我唯一能想到的很明显:你的索引会大一点。话虽如此,这没什么大不了的,因为您的桌子只会存储国家/地区。但是,你为什么想要这样的索引呢?如果您按CountryId排序,那么按Name将其排序为第二个字段是没有意义的。您将始终得到相同的订单。

确实是个坏主意的一件事是让外键指向一个大的主键,因此,请确保如果您使用该主键,您指向国家/地区的外键仍然只使用CountryId列。

于 2009-04-14T01:50:47.663 回答
0

众所周知,国名会发生变化,而不会改变国家的身份。这表明该名称不应成为 PK 的一部分。

于 2009-04-14T01:51:02.857 回答
0

如果您需要强制唯一性,请使用约束。

于 2009-04-14T01:51:22.453 回答