在鱼尾纹 ERD 中表示非此即彼的关系
Representing an either-or relationship in Crows foot ERD
我正在研究 ERD 的练习题,我想知道建模或关系的正确方法是什么。
例如,在跆拳道学校,您将拥有客户帐户,这些帐户将代表一个或多个学生并为其付款。该帐户由家长或学生本人拥有。因此,帐户所有者要么是家长,要么是学生。表达这种关系的最佳方式是什么?
这是我的想法,但我不确定这是否符合最佳实践:
1 条说明
Representing an either-or relationship in Crows foot ERD
你的图表是一个好的开始。注:
- 那不是 ERD。这是 ERD 无法处理的更多细节
- ERD 没有鱼尾纹,即 IEEE 表示法
最终,您需要一个数据模型,该模型具有实现所需的详细信息(远远超过 ERD)。这就是为什么我说你的图表是一个好的开始,它正在朝着那个方向发展。但是,我们有一个关系数据建模标准:IDEF1X,该标准自 1993 年起用于关系数据库建模,自 1984 年起可用,之后才升级为标准。
- 显然,E F Codd 博士的关系模型和关系数据库建模的图解方法都被禁止了。
关系符号,尤其是基数,在 IEEE 符号中比 IDEF1X 更好(更容易理解),因此大多数人使用它。所有数据建模工具(例如 ERwin)都实现了 IDEF1X,并允许对关系使用 IDEF1X 或 IEEE 符号。
2 个请求
预期的图表是非法的。为什么 ?因为你有一个关系 "out" 的人,到两个表。不可能。您在询问如何在数据模型中表示这种关系(在 ERD 中是不可能的)。答案是,一个或门是逻辑项,一个子类型是关系项。
请检查这些答案的概述和细节。点击链接获取实现细节和代码:
How can I relate a primary key field to multiple tables?
子类型可以是:
Exclusive(基本类型必须是子类型之一),或
非排他性(基类型必须是任何 [多个] 子类型)。
从 Role
看来它是独家的。你所说的 Role
是 IDEF1X 中的一个 Discriminator.
这是关系数据库的最佳实践。
关系数据模型
这是数据模型的最佳实践(此详细程度仅显示属性名称)。
当然我所有的数据模型都是在IDEF1X.
中渲染的
我的IDEF1X Introduction是初学者必读的
ParentId, StudentId, OwnerId
都是 PersonId
的 RoleNames(关系词)。这使得 FK 的上下文变得明确。
3更正
but I am unsure if this conforms to best practice
既然你担心,还有一个问题。您的模型中存在错误,这是在每个文件上标记 id
时发生的常见错误之一。这种做法削弱了建模练习,并使其容易出现各种错误。 (我知道你被教的是那种残废的方法。)
由于一个人可以有0-1个Account,而Person PK(对Person来说是唯一的)是Account中的FK,所以可以是Account中的PK。
AccountId不是必需的:它是100%冗余的,多了一个字段和一个索引,可以去掉。
我正在研究 ERD 的练习题,我想知道建模或关系的正确方法是什么。
例如,在跆拳道学校,您将拥有客户帐户,这些帐户将代表一个或多个学生并为其付款。该帐户由家长或学生本人拥有。因此,帐户所有者要么是家长,要么是学生。表达这种关系的最佳方式是什么?
这是我的想法,但我不确定这是否符合最佳实践:
1 条说明
Representing an either-or relationship in Crows foot ERD
你的图表是一个好的开始。注:
- 那不是 ERD。这是 ERD 无法处理的更多细节
- ERD 没有鱼尾纹,即 IEEE 表示法
最终,您需要一个数据模型,该模型具有实现所需的详细信息(远远超过 ERD)。这就是为什么我说你的图表是一个好的开始,它正在朝着那个方向发展。但是,我们有一个关系数据建模标准:IDEF1X,该标准自 1993 年起用于关系数据库建模,自 1984 年起可用,之后才升级为标准。
- 显然,E F Codd 博士的关系模型和关系数据库建模的图解方法都被禁止了。
关系符号,尤其是基数,在 IEEE 符号中比 IDEF1X 更好(更容易理解),因此大多数人使用它。所有数据建模工具(例如 ERwin)都实现了 IDEF1X,并允许对关系使用 IDEF1X 或 IEEE 符号。
2 个请求
预期的图表是非法的。为什么 ?因为你有一个关系 "out" 的人,到两个表。不可能。您在询问如何在数据模型中表示这种关系(在 ERD 中是不可能的)。答案是,一个或门是逻辑项,一个子类型是关系项。
请检查这些答案的概述和细节。点击链接获取实现细节和代码:
How can I relate a primary key field to multiple tables?
子类型可以是:
Exclusive(基本类型必须是子类型之一),或
非排他性(基类型必须是任何 [多个] 子类型)。
从 Role
看来它是独家的。你所说的 Role
是 IDEF1X 中的一个 Discriminator.
这是关系数据库的最佳实践。
关系数据模型
这是数据模型的最佳实践(此详细程度仅显示属性名称)。
当然我所有的数据模型都是在IDEF1X.
中渲染的
我的IDEF1X Introduction是初学者必读的
ParentId, StudentId, OwnerId
都是PersonId
的 RoleNames(关系词)。这使得 FK 的上下文变得明确。
3更正
but I am unsure if this conforms to best practice
既然你担心,还有一个问题。您的模型中存在错误,这是在每个文件上标记 id
时发生的常见错误之一。这种做法削弱了建模练习,并使其容易出现各种错误。 (我知道你被教的是那种残废的方法。)
由于一个人可以有0-1个Account,而Person PK(对Person来说是唯一的)是Account中的FK,所以可以是Account中的PK。
AccountId不是必需的:它是100%冗余的,多了一个字段和一个索引,可以去掉。