SQL - 主键选择

时间:2013-03-30 18:38:52

标签: sql database-design primary-key

如果有表ORGANIZATION,我可以使用license_number作为主键吗?我知道主键应该是不可变的,但我不知道许可证是否如此。此外,两个组织可能有一个许可证吗?如果不是,我应该使用哪个主键?

3 个答案:

答案 0 :(得分:2)

如果您不是 100%肯定license_number是唯一的,请不要将其用作主键。

primary key应该是一个唯一值,可用于引用表中的特定行。为安全起见,为什么不使用auto increment字段?

我会做这样的事情:

CREATE TABLE organization
(
organization_id int NOT NULL AUTO_INCREMENT,
license_number varchar(100) -- Set accordingly
another_attribute varchar(255) NOT NULL,
PRIMARY KEY (organization_id )
)

如果one组织可以many license numbers,则创建另一个名为org_license_numbers的表,并将organization_id跟踪为foreign key organization表和相应的license number

答案 1 :(得分:2)

简短回答:不要将 alien 数字用作PK:

  • 编号不在您的控制范围内,可能会发生变化(如果密钥空间耗尽,可能会添加前缀),甚至可能会被粗暴地重新编号
  • 因为它不受你的控制,所以不保证唯一性。这也可以及时改变。
  • 可以添加额外的关键元素,例如因为同样的公司也可以存在于其他国家/地区
  • 也许您还不知道ORGANISATION_id(还),但您仍然需要创建一条记录
  • PK 可以在其他表中作为此表的外键运行,对数字的更改也会导致更新。

答案 2 :(得分:1)

那么,关于公司许可证号码的独特性,您需要咨询您所在国家/地区的律师。

无论如何,您始终可以创建新的,不相关的ID列(INT IDENTITY),并将其用作主键和聚簇索引键。

另请注意,在SQL Server中,设计器默认情况下使主键列也成为聚簇索引。它并不总是最好的行为。例如,如果您选择许可证号作为主键 - 它可能不是顺序的,这意味着数据库引擎必须在现有行之间插入新行,这将导致页面拆分和群集索引的高度碎片,这可能会影响性能严重(特别是如果桌子很大)。因此,请确保即使您选择将许可证编号作为主键,也请选择更好的聚簇索引键。例如:在表中创建行的日期时间。

祝你好运。