如果有一个表 ORGANIZATION,我可以使用 license_number 作为主键吗?我知道主键应该是不可变的,但我不知道许可证是否如此。此外,两个组织是否有可能拥有一个许可证?如果不是,我应该使用哪个主键?
问问题
118 次
3 回答
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
于 2013-03-30T18:41:01.090 回答
2
简短的回答:不要使用外星人号码作为 PK:
- The numbering is not under your control, it could change (maybe a prefix will be added if the key space is exhausted), they could even be brutally renumbered
- since it is not under your controll, uniqueness is not guaranteed. This could also change in time.
- an extra key element could be added, for instance because the same companies could exist in other countries, too
- maybe you don't know the ORGANISATION_id (yet), but you still need to create a record
- The PK could function as a foreign key to this table in other tables, changes to the number would cause updates there, too.
于 2013-03-30T18:51:43.953 回答
1
好吧,关于公司许可证号的唯一性,您必须咨询您所在国家/地区的律师。
无论如何,您始终可以创建新的、不相关的 ID 列 (INT IDENTITY) 并将其用作主键和聚集索引键。
另请注意,在 SQL Server 中,设计器默认将主键列也设为聚集索引。这并不总是最好的行为。例如,如果您选择许可证号作为主键 - 它可能不是连续的,这意味着数据库引擎必须在现有行之间插入新行,这将导致页面拆分和集群索引的高碎片,这可能会影响性能沉重(特别是如果桌子很大)。因此,请确保即使您选择将许可证号作为主键,也要选择更好的聚集索引键。例如:在表中创建行的日期时间。
祝你好运。
于 2013-03-30T18:45:14.380 回答