将三元关系映射到关系模型(员工、客户、项目)

Mapping a ternary relationship to the relational model (Employes, Customer, Project)

我想将 ER 图的这一部分转换为关系模型。我们有一个三元关系,它说的是以下内容:

建议的解决方案是:

分配(员工 ID、客户 ID、项目 ID)

其中主键由EmployeeID、CustomerID和ProjectID组成。 所有这些属性都是外键,每个都引用其各自的实体。

但是这个解决方案是完全错误的,因为它没有表达与 ER 图相同的东西。我们有一个组合主键,这意味着这三件事的组合是唯一的。这意味着我可以拥有相同的 ProjectID、相同的 EmployeeID 但由不同的 CustomerID 给出(我不想要)。

我该如何解决?

编辑:由于许多用户发现要点没有阐明任何内容,我将对关系的概念进行简短的文字描述:

为此,我得出结论,最好使用两个单独的二元关系而不是一个三元关系。请参阅下面我的回答。

当在关系模型中表达三元关系时,每个具有 "many" 基数指示符的实体集都成为主键的一部分。换句话说,我将您的关系理解为表达函数依赖性 (EmployeeID, ProjectID) -> CustomerID,这将在物理上表示为 Assignment (EmployeeID PK/FK, ProjectID PK/FK, CustomerID FK)

the COMBINATION of those three things is UNIQUE. That implies that I can have the same ProjectID, with the same EmployeeID but given by a different CustomerID (which I do not want).

三元组是唯一的并不暗示——很明显,由于某些行的组合不存在,三元组可以同时是唯一的。另一方面,它不会强制他们缺席。但是基数约束确实如此。他们说的就是子弹(试图)说的——只有某些situations/states会出现。项目符号是 而不是 "what the relationship says"——无论是在给定的 situation/state 中实际形成 relationship/table 的行的意义上还是在什么意义上一行说的是在relationship/table.

时的情况

在这种图中,菱形表示n元业务或应用关系(船)或关联及其对应的table。图中的一条线表示实体类型及其对应的 FK(外键)的参与(遗憾的是,在伪 ER 方法中称为 "relationship"。)约束是对 instances/rows 的限制可以出现在 relationship/table 中。每个instance/row in a relationship/table "says"表示那一行值满足关系。约束 "say" 对所有 situations/states 相关的值有限制。基数是一种约束,表示值 and/or 值组合可以在关系中出现多少次。

有两个主要的基数约定,look-across 和 look-here。在 look-across 中,number/range 表示它附近的类型的实体中有多少可以参与其他实体类型的实体的一个子行,即其他实体的某个子行可以参与多少次 participate/be在 relationship/table。 (Chen 的原始 ER 含义。)在 look-here 中,a number/range 表示其他实体类型的子行可以与它附近的类型的实体一起出现多少次,即附近的实体可以出现多少次 participate/be 在 relationship/table 中。 (Look-here 对于 arity > 2 的关系不是很有用。)

We have a ternary relationship and what it says is the following:

relationship diamond 说的是你在记录行(EmployeeID, CustomerID, ProjectID) 其中(类似于)开发人员 EmployeeID 由客户 CustomerID 分配给项目 ProjectID。基数表示的是只有特定的 instances/rows 集合才能满足任何给定 situation/state.

中的关系
  • 1 Customer gives 1 Project to -> multiple Developers
  • 1 Customer assigns 1 Developer with -> multiple Projects
  • 1 Developer is assigned 1 Project by -> ONE Customer

您的项目符号约束不明确。数字一直卡在实体类型的前面——几乎就像人们将 id 值放入以获取那行 id 值在 relationship/table 中表示的内容一样——但产生的几乎是句子,其中也有无法解释的箭头,没有任何意义。也许您想说,对于给定的客户项目子行值,可以有多个开发人员值,等等?这将给出图表中的交叉基数。可你没说过。

正如我一开始在问题中提到的,关系的描述如下:

  • 单个客户可以赠送一个或多个项目
  • 一个项目可以由一个客户提供
  • 每个项目可由一名或多名开发人员完成
  • 每个开发人员可以从事多个项目(无论项目是由哪个客户提供的)

问题出在ER图本身:它并不完全代表上面的描述。问题在于单个项目只能由一个客户提供的约束。这就是为什么用两个单独的二元关系而不是三元关系对其进行建模会更有意义。

也就是说,CustomerProject 之间的关系应该是 1:n 关系,而 Project 之间的关系=16=]Project 和 Developer 应该是 m:n 关系。映射这些关系可为我们提供以下信息:

  • 客户(CustomerID)with Primary Key=CustomerID
  • 项目(ProjectID,CustomerID)with Primary Key=CustomerID and Foreign Key=CustomerID referenced the Customer
  • 开发者(DeveloperID)PK=DeveloperID
  • ProjectDevelopment (ProjectID, DeveloperID) with PK={ProjectID, DeveloperID)