下图显示了对主键和外键的初始选择。此图反映了一些重要的决定。
对于 name 表,选择了主键 rec_num。rec_num 的数据类型是 SERIAL。rec_num 的值由系统生成。如果查看 name 表中的其他列(或属性),您会看到与列相关联的数据类型大部分基于字符。在这些列中,没有任何一个能单独作为主键的合适候选键。如果将表的元素组合成组合键,那么会创建不方便的键。SERIAL 数据类型提供了一个键,您还可以使用该键将其他表连接到 name 表。
voice、fax、modem 和 address 表每个都通过 rec_num 键连接到 name。
对于 voice、fax 和 modem 表,电话号码都用作主键。address 表包含特殊列 (id_num),该列除了作为主键没有其他用途。 这样做是因为如果 id_num 不存在,那么所有其他列将必须一起作为一个组合键使用,以确保不会存在重复的主键。将所有列用作主键将是非常低效和混乱的。
图: 添加了主键和外键的电话号码簿图