ERD - 如何用第三个实体作为“属性”建模两个实体之间的关系

3
我正在建模一个实体关系图,并遇到了困难。我不确定我的考虑是否正确,或者ERD是否可以模拟我想要的内容:
我有三个实体:员工、项目和角色。员工与项目之间存在关系:员工正在参与某个项目。但是这位员工不仅仅在这个项目上工作,他/她还有一个操作领域,以角色的形式给出。但是,关系不仅仅由属性描述吗?我怎么能做到像“一个员工在这个项目上工作,担任……”这样的描述呢?当然,我可以使用roleId作为属性,就像设计数据库一样,但在ERD中,这是什么关系?
3个回答

5

员工

  • 员工ID (主键)

项目

  • 项目ID (主键)
  • 项目描述

职位

  • 职位ID (主键)
  • 职位描述

如果每个员工只能在一个项目中担任一种角色:

员工-项目映射表

  • 项目ID (主键,外键参照项目表)
  • 员工ID (主键,外键参照员工表)
  • 职位ID (外键参照职位表)

如果每个员工可以在一个项目中担任多种角色:

员工-项目映射表

  • 项目ID (主键,外键参照项目表)
  • 员工ID (主键,外键参照员工表)
  • 职位ID (主键,外键参照职位表)

两者的区别在于后一版本的复合主键包括职位。由于是所有三列的复合主键,因此值的组合必须唯一,下面的内容是有效的:

project_id  employee_id  role_id
---------------------------------
1           1            1
1           1            2

如果role_id未包含在复合主键中,那么仅能创建一个用户和项目的组合 - 这意味着一个用户只能有一个角色。
检查约束不起作用 - 它仅检查行,而不是整个表。虽然触发器可以工作,但既然可以通过复合主键或唯一约束强制执行关系,为什么要费劲去写触发器呢? 触发器在ERD中不可见,也不能像CREATE TABLE或DESC table_name这样列出。

如果员工和项目包含在唯一索引中,则无法输入多个。 - Randy
1
@OMG:3. 你仍然缺少 role_id 的外键(当然不包括在主键中)。4. 就我个人而言,我会选择第二种方法,并添加一个 CHECK 约束来防止多个角色,如果需要,在将来可以删除该约束而不影响表数据。 - PerformanceDBA
2
@Randy:但是表需要一个主键,而提供的主键是完美的;为什么要添加另一列(无论你想要的主键是什么),并添加另一个索引呢?这让人难以理解。 - PerformanceDBA
非常感谢您的回答。我同意您的数据库设计(实际上,每个员工在每个项目中只能拥有一个角色),但我担心我的问题有另一个意图:在设计数据库之前,我想将问题建模为实体关系图(使用陈式符号)。在这个图中,我想创建一个员工和项目之间的关系,而不必考虑后续的键和约束。 - MatthiasG
1
@OMG:对于一个有锤子的木匠来说,每个问题都像是一颗钉子。 Matthias 此时处于建模阶段,而不是实现阶段。在这个阶段进行 DDL 是过早的。它要么会被丢弃,要么更糟糕的是,如果实施了,就必须进行更改。 - PerformanceDBA
显示剩余3条评论

3

如何建模关系...实体...属性?

在设计数据库之前,我想将问题建模为实体-关系图(使用Chen符号)。在这个图中,我想创建一个员工和项目之间的关系,而不必考虑后续的键和约束。

这是完全可以理解的,也是正确的。纸张是便宜的,数据库中的对象更加昂贵。建模需求并不断改进,直到您有信心,然后再实施。

许多网站的问题在于,有很多木匠,虽然出于好意,但将每个问题视为钉子,并提供DDL,而不是所请求的建模帮助。缺少的是上下文和含义,因此最终结果是具有固定“键”但缺乏上下文和含义的硬性实施。建模允许我们对与我们相关的各种方面进行建模,而不必担心在DDL中看起来像什么。

另一种说法是,OMG已经回答了一个问题如何建模“员工在这个项目上工作为…”?,我正在回答您的整个问题。

在逻辑层面,多对多关系是正确的。这样的关系没有其他考虑在物理层面上呈现为联合表。但是,现在决定这一点还为时过早,因为您仍然在建模关系的上下文和含义。

...也不在SO markdown符号的范围内提供它。 IME,像Oracle Designer这样的工具会在创建实体后生成这些图

胡说八道。建模的整个想法是在编写代码、购买平台或实施DDL之前,使用图表在纸上开发和改进某些内容。该评论仅是关于在事后反向工程现有数据库,许多产品提供此功能。

建模示例,进展

使用对您有意义的任何符号来建模所需内容。当然,标准符号更具普适性。这里是一个
针对您的ERD
(我不知道“SO markdown符号”如何限制提供预先建模的建议)。我提供了一个可能发生的进展示例。没有什么是“正确”的或“错误”的,这都是纸张;直到您决定哪些元素值得确认,然后才有可能进行下一步进展。

  1. 首先,我们从简单的多对多关系开始,你已经知道一些关于它们的信息。尝试模拟一个三方关系是不正确的,这是建模错误:为了解决一个三角恋,你需要首先分别确定每个参与者之间的离散关系;这意味着所有关系都只是双向的。

  2. 项目、员工和角色实体很清晰,我们已经了解了一些相关信息。在这里,我没有详细说明主要实体,因为它们是“强”的,而且不是你关注的重点。

  3. 进展使用了关系的示例属性,你可以使用自己的属性。(我们的比利时同事已经用文字识别了问题,我只是提供了图片。)人们通常不会做的很多事情,他们应该做;我关心的是真正的建模,从上到下,以便进展并得出正确的数据模型。删除任何无用的东西,并继续前进。

  4. 我假设关系的属性证明了实体的存在,所以现在我已经画出了它们。在这里,我使用椭圆形,你可以使用菱形或倒三角形,只要使用一些符号来建模你需要的内容。

  5. 现在我们可以清楚地看到:我们不想要Project::Employee::Role,因为那样会允许员工执行任何角色;我们希望只有之前被批准该角色的员工才能被选择。因此,Employee::Role变得更加“强”。

  6. 因此,Employee::Role是一个实体。粉色的东西是该特定组合或Employee+Role的子项,而不是所有Employee或所有Role的子项。

  7. 同样,我们不希望任何员工在任何项目中担任任何可能的工作,我们希望他们只在批准的项目中担任批准的工作。因此,Project::Role成为一个强身份,并且它已经具有属性了。

  8. 因此,Project::Role是一个实体。剩下的椭圆形是该特定组合或Project+Role的子项,而不是所有Project的子项。

  9. 我们的粉色子项获得了实体状态,具有特定的属性。更重要的是,它的约束来自于先前受限制的实体,而不是简单的实体。

  10. 数据具有自然的顺序或层次结构,按照这种方式绘制的图表更容易理解。现在我们有机会查看属性。它们可能看起来相同或类似或令人困惑;而现在由于上下文和层次结构,它们具有清晰的含义。

我已经介绍了"标识符"的概念,但并没有详细展开,如果需要的话我们可以进行讨论。你可以看到标识符非常重要,并且作为建模过程中的普通部分暴露出来。
一般来说(与我的示例进展相反),当我们进行规范化时,三个初始椭圆可能会变成一个或两个,或者保持为三个对象;简单的联合表没有属性;或者是具有属性的真正实体...但现在我们不应该关心这些。而且,在这个阶段进行数据定义语言(DDL)或规范化还为时过早。我们对键值、与其相关的属性以及它们之间的关系知之甚少,更不用说关心了。就示例而言,实体是清晰而明确的。
请给予反馈,以便您能够进一步发展。
编辑:图表已更新,跨多页。

哇,非常感谢您详细的回答和示例。正如您所说,现在我必须决定是否使用一种易于建模但不正确的方式作为标准,还是使用更困难的标准建模。我需要考虑一下,但我相信,解决方法在您的答案中的某个部分。 - MatthiasG
1
@Matthias:嗯。不是的。我的所有工作都严格遵守IDEF1X标准。问题在于,你不能从一个标准(声明)中学习方法论,就像你不能从烹饪书籍中学会成为一名厨师;你必须了解方法论并具有一些经验,修复混乱,欣赏标准的价值,然后学习标准并改进/遵守。有很多东西只能从导师那里学到,而不是从书本中学习。这就是为什么我说“只要做,建模”,不要担心对错,这将促进您的理解。 - PerformanceDBA
1
@Matthias:你能看到我使用的是一个简单的绘图工具,而不是符合IDEF1X标准的建模工具吗?这里有一个简单的IDEF1X模型。即使在那里,我也使用了同样简单的绘图工具。标准不在工具中,也不在我的手指中。 - PerformanceDBA

1
“在我设计数据库之前,我想将问题建模为实体关系图(使用陈式符号)。在这个图中,我想创建一个员工和项目之间的关系,而不必考虑随后出现的键和约束。”
“如果两者之间的‘工作’关系是多对多的,并且该关系具有描述(发生)关系的进一步属性,则您通常别无选择,只能将其‘实例化’,即将其定义为额外的实体。一些工具支持ERD方言,允许为任何关系指定其他属性(在圆形框箭头到关系箭头),但我认为这不是常见做法。”

+1: Oracle Designer IME 提供了鸦脚记号用于表示 1:many/many:many 的关系,以及虚线用于表示可选性(可空性)。 - OMG Ponies
1
在Oracle诞生之前,有一个关系建模标准,它消除了所有这些混乱;它被广泛接受,由专业人士和组织实施独立、易于使用且性能良好的关系模型。它是关系模型的更严格实现,促进了关键字的正确处理。它具有优秀的明确符号表示。然而,IEEE的“鸦脚”关系符号更为广泛理解,因此大多数建模工具允许您使用其中任何一个(仅适用于关系)。 - PerformanceDBA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接