发现关系

一种很方便的发现关系的方法是准备一个矩阵,该矩阵先在每一行上列出所有实体的名称,然后在每一列上再次这样做。图 1 中的矩阵反映了个人电话号码簿的实体。

图: 反映个人电话号码簿实体的矩阵


本图显示一张五列五行的表。列和行都使用了相同的标签。以下每项都作为一行和一列的标签: -name -address -number (voice) -number (fax) -number (modem) 表中的那些重复单元格都被遮蔽。例如有两个单元格都表示 name 和 address 之间的关系。一个是 (name,address),另一个是 (address,name)。(address,name) 单元格已被遮蔽。

您可以忽略此矩阵的阴影部分。您必须考虑对角单元格;即,您必须询问“A 与另一个 A 之间存在什么关系?”这个问题。在此模型中,答案始终是“none”。在不同的 name 之间或者不同的 address 之间不存在关系,至少您不需要在此模型中记录任何关系。当 A 与另一个 A 之间存在关系时,表示找到了递归关系。(请参阅解析其他特殊关系。)

对于答案明显为 none 的所有单元格,在矩阵中写下 none。图 2 显示了当前矩阵。

图: 包含初始关系的矩阵


显示的矩阵与先前图中的相同,只是在行和列标签相同的所有单元格中添加了词语“none”。例如,(name,name) 单元格中有词语“none”。

尽管在此模型中没有实体与它们本身相关,但在其他模型中情况并非总是如此。典型的示例是:一个雇员是另一个雇员的经理。另一个示例出现在制造业:一个部件实体是另一个部件的组件。

在其余单元格中,写下行上的实体与列中的实体之间存在的连接关系。下列类型的关系是有可能的:
  • 一对一 (1:1),在此关系中,对于一个实体 B,存在至多一个实体 A,并且对于一个 A,也是存在至多一个 B
  • 一对多 (1:n),在此关系中,绝不会存在多个实体 A,但可以有若干个实体 BA 相关(反之亦然)。
  • 多对多 (m:n),在此关系中,可以有若干个实体 A 与一个 B 相关,并且可以有若干个实体 B 与一个 A 相关。

一对多关系最为常见。电话号码簿模型显示了一对多和多对多关系。

图 2 所示,第一个未填充的单元格表示名称与地址之间的关系。这些实体之间存在什么样的连接?您可能会问自己“可以有多少个名称与一个地址相关联?”。您决定一个名称可以有零个一个地址,但不能有多个。您 在 name 对面及 address 下面写下 0-1,如图 3 所示。

图: name 与 address 之间的关系


开始图描述 - 在环境文本中对此图进行了描述。- 结束图描述

问问您自己:有多少个地址可以与一个名称相关联。您决定一个地址可以与多个名称相关联。例如:您可以了解到多个人在一间公司工作或两个以上的人的住所在同一地址。

地址可以与零个名称相关联吗?即,可能存在没有任何名称使用的地址吗?您的决定是“是的,可以存在”。在 address 下面及 name 对面,您写下 0-n,如图 4 所示。

图: address 与 name 之间的关系


(name,address) 单元格显示 name 到 address 以及 address 到 name 的关系。name 到 address 关系是 0-1,写在单元格中靠左的位置以表示关系中先出现行的名称。新添加的 address 到 name 关系是 0-n,写在单元格中靠上的位置以表示关系中先出现列的名称。

如果您决定除非地址与至少一个名称相关联否则不能存在,那么写下 1-n 而不是 0-n

当在任何一端将关系的基数限制为 1 时,就是 1:n 关系。在这种情况下,名称与地址之间的关系是 1:n 关系。

现在考虑图 2 中的下一个单元格:名称与语音电话号码之间的关系。名称可以与多少个语音电话号码相关联,是一个还是多个?当您查看电话号码簿时,您会看到通常为某个人记录多个电话号码。一个繁忙的推销员会有家庭电话号码、办公室电话号码、寻呼机号码和车载电话号码。但也可能有不带相关联电话号码的名称。您在 name 对面及 number (voice) 下面写下 0-n,如图 5 所示。

图: name 与 number 之间的关系


开始图描述 - 在环境文本中对此图进行了描述。- 结束图描述
此关系的另一端是什么?有多少个名称可以与一个语音电话号码相关联?您决定只有一个名称可以与一个语音电话号码相关联。电话号码可以与零个名称相关联吗?您决定除非某人使用某个电话号码,否则不需要记录该电话号码。您在 number (voice) 下面及 name 对面写下 1,如图 6 所示。

图: number 与 name 之间的关系


(name, number (voice)) 单元格显示了两种关系。name 到 number 关系显示为 0-n。写在单元格中靠左的位置以表示关系中先出现行的名称。number (voice) 到 name 关系是 1,写在单元格中靠上的位置以表示关系中先出现列的名称。
要以同一方式填写矩阵的其余部分,请考虑下列因素:
  • 一个名称可以与多个传真号码相关联;例如:一间公司可以有若干台传真机。反过来,一个传真号码可以与多个名称相关联;例如:若干个人员可以使用同一个传真号码。
  • 调制解调器号码必须刚好与一个名称相关联。(这是为了使示例复杂化而作的任意规定;请将其作为一项设计需求予以接受。)然而,一个名称可以有多个相关联的调制解调器号码;例如:一台公司计算机可以带有若干拨号线路。
  • 尽管现实世界中的语音电话号码与地址之间、调制解调器号码与地址之间以及传真号码与地址之间存在某种关系,但这些关系都不必记录在此模型中。通过 name,已存在间接的关系。
图 7 显示了完成后的矩阵。

图: 已完成的电话号码簿矩阵


未出现在 name 行中的任何单元格或者被遮蔽或者有词语“none”。(name,name) 关系是“none”。其余关系如下: name 到 address:0-1 address 到 name:0-n name 到 number (voice):0-n number (voice) 到 name:1 name 到 number (fax):0-n number (fax) 到 name:1-n name 到 number (modem):0-n number (modem) 到 name:1

矩阵显示的其他决定包括传真号码与调制解调器号码之间、语音电话号码与传真号码之间或语音电话号码与调制解调器号码之间不存在任何关系。

您可能会不赞同其中某些决定(例如:不支持语音电话号码与调制解调器号码之间的关系)。但是,为了实现本示例,这些就是我们的商业规则。