数据库主键 - >标识字段和名称字段?

Pur*_*ome 1 database-design primary-key

我的所有表都有Id某种类型的字段(UserId, PostId, FooId等).我通常把它作为主键.

我有一张桌子Countries.它有

CountryId SMALLINT
Name VARCHAR(100)  -- Yes, english country names only, in this column.
AndSomeOtherFields.
Run Code Online (Sandbox Code Playgroud)

现在,我知道Name必须是独一无二的.所有国家/地区名称都是唯 如果我做PrimaryKey== CountryId ASC Name ASC?是好/坏/ 如何?

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

谢天谢地.

Rex*_*x M 6

制作主键CountryId 并且 Name不确保名称是唯一的.它只是确保每个CountryId- Name 都是独一无二的,显然CountryId已经是独一无二的,是一个"ID".所以,你仍然可以有,例如,1-US并且19-US,作为对是唯一的.

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

另一个要提出的要点是,在您的特定示例中,您存储的国家/地区列表a)非常短且b)变化不大.无论你做什么,反对这张桌子的查询都会非常快.即使SQL Server每次都必须进行全表扫描,您甚至可能都不会注意到.您不必担心页面碎片.您可以跳过ID列并将其用Name作主键.

或者,如果要保留ID但仅强制使用国家/地区名称的唯一性,则可以在"名称"列上添加" 唯一约束 ".

一般来说,很难在一个答案中过多地覆盖主键,聚簇索引和索引的问题.以下是一些入门的好资源: