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

标签 database database-design relational-database entity-relationship cardinality

ER-Diagram

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

  • 1 位客户将 1 个项目提供给 -> 多个开发人员
  • 1 位客户分配给 1 位开发人员 -> 多个项目
  • 1 个开发人员被 -> 一个客户分配了 1 个项目

建议的解决方案是这样的:

分配(EmployeeID、CustomerID、ProjectID)

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

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

我该如何解决?

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

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

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

最佳答案

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

关于database - 将三元关系映射到关系模型(员工、客户、项目),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47201981/

相关文章:

database - 存储过程是否在 Postgres 的数据库事务中运行?

database - Kubernetes 持久卷 : hostpath vs local and data persistence

mysql - SQLite 并发问题破坏交易?

sql - MySQL,阅读这条 EXPLAIN 语句

mysql - 优化没有索引的表的删除查询?

Java XML 格式直接保存到关系或非关系数据库

sql-server - 1 个服务器实例中的多个数据库镜像

php - PHP 最好的数据库类或函数?

mysql - 数据库结构重新评估

sql - 在 SQL 中保存顺序首选项