数据库设计的递归关系

Son*_*ngo 20 sql database database-design erd data-modeling

考虑这种情况,我正在尝试为公司建模数据库:

  • 实体:Employees,Managers,Departments.
  • 一个Employee只有1作品DepartmentDepartment可能有许多Employees在它的工作.
  • A Manager可以只管理1个Department,类似的Department可能只有1个Manager.
  • 一个Manager监督很多Employees,但一个Employee只由一个监督Manager.

现在我有两种方法来模拟这个:

第一解决方案

我会考虑Manager实体继承Employee实体,考虑到我将保留管理者独有的数据(例如奖金和状态).

第一解决方案

  • 由于之间的关系Department,并Employee1:N后来我就把这 Department Id作为一个外键Employee表的Works 关系.

  • 由于之间的关系Department,并Manager1:1后来我就把这 Department Id作为一个外键Manager表的Manages 关系.

问题:我如何表示Manager和之间的递归关系Employee


二解决方案:

我认为Manager不需要实体其他Employees还可能有BonusStatus.(实际上我添加了这两个属性只是为了看看如何在两种情况下对其进行建模) 二解决方案

  • 由于之间的关系Department,并Employee1:N后来我就把这 Department Id作为一个外键Employee表的Works 关系.
  • 由于之间的关系Employee,并Manager1:N后来我就把这 Employee Id作为一个外键Employee表的Supervises 关系,并调用它Manager Id.

问题:我怎样才能代表ManagerDepartment?之间的关系?


问题:

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

Bra*_*vic 26

我可能会选择以下内容:

在此输入图像描述

该模型具有以下特征:

  • 经理"继承"员工.
    • 要表示员工,请在EMPLOYEE中插入一行.
    • 为了表示一个经理,插入EMPLOYEE一行,并在MANAGER一行.
  • 一个部门可以拥有多名员工.
  • 每个部门只有1个经理,每个经理管理0个或1个部门.
  • 主管可以是普通员工或经理.
  • 部门不需要"匹配":
    • 主管可以在受监督员工的不同部门工作.
    • 经理可以管理他工作的不同部门.
    • 如果主管是经理,那么他所管理的部门,他所在的部门以及他/她受监管的员工的部门都可以是不同的.

注意:如果您的DBMS不支持延迟约束,您将需要使DEPARTMENT.MANAGER_ID为NULL,以打破否则会阻止您插入新数据的循环.


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

在此输入图像描述

由于EMPLOYEE_ID必须是全局唯一的,因此它不能与DEPARTMENT_ID一起保留在组合键中.因此,我们将其替换为密钥,而是使用PK中的代理EMPLOYEE_NO.

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


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

在此输入图像描述

......它表示"类别".在这种情况下,您可以简单地将其解释为EMPLOYEE和MANAGER之间的"1到0或1"关系.

  • 实际上,这是我第一次听说 _Deferred Constraints_,主要是因为我不是数据库开发人员,而且我的大部分工作都是在 MySql 上进行的,我刚刚发现它不支持延迟约束 :( 无论如何感谢出色的解释我希望我能再次投票给你的答案:D (2认同)