解析 m:n 关系

多对多 (m:n) 关系使模型和应用程序开发过程更加复杂并容易令人混淆。解析 m:n 关系的关键是将两个实体分开并用第三个相交实体来在它们之间创建两个一对多 (1:n) 关系。相交实体通常包含来自两个相连接的实体的属性。

要解析 m:n 关系,请再次分析商业规则。您是否已经准确地对关系制图?如图 1 所示,电话号码簿示例在 namefax 实体 之间具有 m:n 关系。商业规则指出“一个人可以有零个、一个或许多传真号码;一个传真号码可以用于若干个人”。根据我们先前为 voice 实体选择的作为主键的内容,存在 m:n 关系。

fax 实体中存在一个问题,其原因在于电话号码(已将其指定为主键)可以在 fax 实体中出现多次;这违反了主键的条件。记住,主键必须是唯一的。

要解析这种 m:n 关系,可以在 namefax 实体之间添加相交实体,如图 1 所示。新的相交实体 faxname 包含两个属性:fax_numrec_num。此实体的主键是这两个属性的组合。从个别来看,每个属性都是一个外键,它引用作为其来源的表。由于一个名称可以与许多传真号码相关联,并且在另一个方向上每个 faxname 组合可以与一个 rec_num 相关联,所以 namefaxname 表之间的关系是 1:n 关系。由于每个号码可以与许多 faxname 组合相关联,所以 faxfaxname 表之间的关系是 1:n 关系。

图: 解析多对多 (m:n) 关系


本图有两部分。一半显示添加相交实体之前的情况,另一半显示添加相交实体之后的情况。 实体中显示了所有属性,但是本文本中只描述了主键和外键。 在图的“之前”一侧,“name”实体有一个主键 rec_num。 该主键连接到“fax”实体,“fax”实体有 fax_num 主键和 rec_num 外键。 关系线的“fax”一端有“许多”符号和“可选”符号。 关系线的“name”一端有“许多”符号。 在图的“之后”一侧,一个新实体添加到了“name”和“fax”之间。 新实体名为“faxname”。有注释表明“faxname”是相交实体。 “faxname”实体有一个包含两个属性 fax_name 和 rec_num 的主键。 同样这两个属性也是外键。该实体中没有其他属性。 “fax”实体有 fax_num 主键,没有外键。 “name”实体有 rec_num 主键,没有外键。 “faxname”和“fax”之间有一条关系线。关系线的“fax”一端没有特殊符号。 关系线的“faxname”一端有“许多”符号。 “name”和“faxname”之间也有一条关系线。 关系线的“name”一端没有特殊符号。 线的“faxname”一端有“可选”符号和“许多”符号。