为电话号码簿图添加键

下图显示了对主键和外键的初始选择。此图反映了一些重要的决定。

对于 name 表,选择了主键 rec_numrec_num 的数据类型是 SERIAL。rec_num 的值由系统生成。如果查看 name 表中的其他列(或属性),您会看到与列相关联的数据类型大部分基于字符。在这些列中,没有任何一个能单独作为主键的合适候选键。如果将表的元素组合成组合键,那么会创建不方便的键。SERIAL 数据类型提供了一个键,您还可以使用该键将其他表连接到 name 表。

voicefaxmodemaddress 表每个都通过 rec_num 键连接到 name

对于 voicefaxmodem 表,电话号码都用作主键。address 表包含特殊列 (id_num),该列除了作为主键没有其他用途。 这样做是因为如果 id_num 不存在,那么所有其他列将必须一起作为一个组合键使用,以确保不会存在重复的主键。将所有列用作主键将是非常低效和混乱的。

图: 添加了主键和外键的电话号码簿图


本图中有五个实体。每个实体由一个矩形表示。每个实体的名称在其相应的矩形的上方。每个实体的属性在其相应的矩形中。这五个实体的名称是:name、voice、fax、modem 和 address。 图的右下角有一个图注,表示属性后的字母 PK 表明这是一个主键(或者是组合主键一部分),属性后的字母 FK 表明这是一个外键。PK 和 FK 不是属性名称的一部分。 “name”实体的属性是: rec_num PK、lname、fname、bdate、anniv、email、child1、child2 和 child3。 “address”实体的属性是:id_num PK、rec_num FK、street、city、state 和 zipcode。 “voice”实体的属性是:vce_num PK 和 vce_num FK 和 vce_type。 “fax”实体的属性是:fax_num PK、rec_num FK、oper_num 和 oper_till。 “modem”实体的属性是:mdm_num PK、rec_num FK、b9600, b14400 和 b28800。 “name”实体通过关系连接到另外四个实体。另外四个实体彼此都不连接。 “name”和“voice”之间的关系在靠近“name”的一端没有特殊的符号。 在靠近“voice”的一端有“可选”符号和“许多”符号。 “name”和“fax”之间的关系在靠近“name”的一端有“许多”符号。 在靠近“fax”的一端有“可选”符号和“许多”符号。 “name”和“modem”之间的关系在靠近“name”的一端有“刚好有一个”符号。 在靠近“modem”的一端有“可选”符号和“许多”符号。 “name”和“address”之间的关系在靠近“name”的一端有“可选”符号和“许多”符号。 在靠近“address”的一端有“可选”符号和“刚好一个”符号。