假设{Author, Title, Edition}
唯一标识一本书,则以下成立:
它是一个超级键——唯一标识一个元组(行)。
它是不可约的——删除任何列都不会再使其成为键。
它是一个候选键——一个不可约的超键是一个候选键。
现在让我们考虑 ID(整数)
我可以推断,Book
表键将作为外键出现在少数其他表中,并且也会出现在少数索引中。因此,这将占用相当多的空间——比如三列 x 40 个字符(或其他......)——在每个表中加上匹配的索引。
为了使这些“其他”表和索引更小,我可以在表中添加一个唯一整数列Book
作为键,该键将被引用为外键。像这样说:
alter table Book add BookID integer not null identity;
由于BookID
(必须)也是唯一的,该Book
表现在有两个候选键。
现在我可以选择BookID
作为主键。
alter table Book add constraint pk_Book primary key (BookID);
但是,{Author,Title,Edition}
必须保留一个键(唯一)以防止这样的事情:
BookID Author Title Edition
-----------------------------------------------
1 C.J.Date Database Design 1
2 C.J.Date Database Design 1
总而言之,添加BookID
- 并选择它作为主要 - 并没有停止 {Author, Title, Edition}
成为(候选)键。它仍然必须有自己的唯一约束,通常是匹配索引。
另请注意,从设计角度来看,此决定是在“物理级别”上完成的。一般来说,在设计的逻辑层面上,这ID
并不存在——它是在考虑列大小和索引时引入的。因此,物理模式是从逻辑模式派生的。根据所使用的数据库大小、RDBMS 和硬件,这些大小推理都不会产生可衡量的效果——因此,将{Author, Title, Edition}
其用作 PK 可能是非常好的设计——除非得到不同的证明。