考虑这样的情况,我试图为一家公司建模一个数据库:

  • 实体:EmployeesManagersDepartments.
  • Employee只在1Department中工作,而Department可能有很多Employees在其中工作.
  • Manager可以仅管理1Department,类似地,Department可以仅具有1Manager.
  • Manager可以管理多个Employees,而Employee只能管理一个Manager.

Now I have 2 ways to model this:

100

我将考虑Manager个实体从Employee个实体继承,考虑到我将保留对管理者来说唯一的数据(例如, prize 和状态).

First Solution

  • 由于DepartmentEmployee之间的关系是1:N,那么我将把 Department Id作为WorksEmployee表中的外键 关系.

  • 由于DepartmentManager之间的关系是1:1,那么我将把 Department Id作为ManagesManager表中的外键 关系.

Problem: How can I represent the recursive relation between the 100 and 101?


100

I'll consider that the Manager entity is not needed as other Employees may also have a Bonus and Status. (Actually I added these 2 attributes just to see how to model it in both cases) Second solution

  • 由于DepartmentEmployee之间的关系是1:N,那么我将把 Department Id作为WorksEmployee表中的外键 关系.
  • 既然EmployeeManager之间的关系是1:N,那么我将把

Problem: How can I represent the relation between the 100 and 101?


问题:

  1. 这两种设计都有明显的错误吗?
  2. 如何解决这两种情况下的每个问题?
  3. 有比这两个更好的解决方案吗?

推荐答案

我可能会说:

在此处输入图像描述

该模型具有以下特点:

  • 经理"继承"员工.
  • 一个部门可以有多个员工.
  • 每个部门只有一名经理,每个经理管理0或1个部门.
  • 主管可以是普通员工,也可以是经理.
  • 各部门无需"匹配":

注意:如果您的DBMS不支持延迟约束,您将希望使部门.MANAGER_ID NULL能够打破循环,否则会阻止您插入新数据.


如果要求部门匹配,那么您可以使用特定于DBMS的技术(例如触发器或"特殊"约束),或者将DEPARTMENT_ID"传播"到员工的PK中.这种传播最终实现了匹配:

在此处输入图像描述

由于EMPLOYEE_ID必须是全局唯一的,它不能与DEPARTMENT_ID一起留在复合密钥中.因此,我们将其设为备用密钥,并在PK中使用代理EMPLOYEE_NO.

此模型可防止经理管理一个部门并在另一个部门工作,或主管管理来自不同部门的员工.


如果你不熟悉这个符号的话...

在此处输入图像描述

.它表示一个"类别".在此上下文中,您可以简单地将其解释为员工和经理之间的"1对0或1"关系.

Database相关问答推荐

为Postgres数据库字段创建复合索引

如何替换对象数组内的数组元素

UML 类图中关联的复杂规则

您是否遇到过 SQL Server 因为引用了太多表而无法执行的查询?

我应该为 Realm 中的每个实体定义主键吗?

我们如何使用 Hibernate 和 JPA 调用存储过程?

有没有办法为 2 个具有不同包名称的应用程序提供 1 个 Firebase 数据库?

使用 Java 对 mysql 数据库进行简单备份和恢复

两个不同数据库中的两个表之间的连接有什么问题?

Boyce-Codd 范式的良好 KISS 描述是什么?

无法启动 MongoDB:Windows 中的系统错误 1067

如果数据库已经提供缓存,为什么还要使用应用程序级缓存?

有人可以详细解释 SOLR requestHandlers 和 responseWriters 吗?

Hibernate如何连接多个数据库

Django:将博客条目查看次数加一,这有效率吗?

如何使用 Hibernate 在不丢失数据的情况下更新数据库模式?

如何动态更改 Ruby on Rails 中所有模型的 Active Record 数据库?

游戏中使用什么样的数据库?

用于存储文件夹系统的数据库模式的 Select

为什么关系数据库存在可伸缩性问题?