关于sql:递归关系的数据库设计

Database design for a recursive relationship

考虑一下这种情况,我正试图为一家公司建立一个数据库模型:

  • 实体:EmployeesManagersDepartments
  • 一个Employee只在1个Department中工作,而一个Department可能有许多Employees在其中工作。
  • 一个Manager只能管理一个Department,同样,一个Department只能管理一个Manager
  • 一个Manager监督许多Employees,但一个Employee只由一个Manager监督。

现在我有两种方法来建模:

第一个解决方案:

我将考虑Manager实体继承自Employee实体,因为我将保留经理独有的数据(例如奖金和状态)。

First Solution

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

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

问题:如何表示ManagerEmployee之间的递归关系?

第二种解决方案:

我认为不需要Manager实体,因为其他Employees也可能有BonusStatus。(实际上,我添加了这两个属性只是为了了解如何在这两种情况下建模)氧化镁

  • 既然DepartmentEmployee之间的关系是1:N那么我将把Department Id作为WorksEmployee表中的外键关系。
  • 既然EmployeeManager之间的关系是1:N那么我将把Employee Id作为SupervisesEmployee表中的外键关系,称之为Manager Id

问题:我如何表示ManagerDepartment之间的关系?

问题:

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

  • 我去与D类:东西probablyP></

    enter image description hereP></

    特点:This has the following模型P></

    • "inherits雇员经理"。
      • 表示方法在单安排在插入雇员,雇员。
      • 在表示方法中插入一行的经理,经理和雇员在一行。
    • 可以在多个部门的雇员。
    • 每个部门经理都有确切的说因为是1和0或1 manages部门经理。
    • 向主管或经理可以是普通雇员。
    • are not required to cameroon departments."匹配":
      • 主管可以在工作中supervised different from the处的雇员。
      • 在不同的部门经理可以管理从那里辐射(S)的作品。
      • 如果是在主管经理部(S),then the the manages部辐射,辐射(S)和部门的工作在他的/她的杂志(S)可以在不同的supervised好雇员。

    注:如果你的数据库支持does not延迟约束,你想让_ ID the department.manager空能,to that otherwise the周霹雳会防止你从inserting新的日期。P></

    if the cameroon departments.是来比赛,或者你会在D -特异性employ DBMS技术(such as触发器约束或"特殊"或"传播"),_ into the the Department of雇员ID PK。这就是ultimately匹配传播enables the:P></

    enter image description hereP></

    因为_雇员ID必须是唯一globally,恩在一起组合cannot在the key with the百货_ ID。我们知道,而不是让交替使用the key and the _代孕雇员不在PK。P></

    从这个模型,你有prevents经理部和工作在一个manages supervises主管,雇员,或从不同的部门。P></

    在你不熟悉的房子象征with the…P></

    enter image description hereP></

    ...it denotes"category"。在这上下文,你可以简单的解释,它作为"0或1到1之间的经理和雇员的关系。P></


    在不详细介绍的情况下,我向您保证,从长远来看,员工/经理/部门解决方案是不高兴的来源(首先),然后是负责维护数据库和/或开发其界面的人员的真正PITA(稍后)。所以我建议你坚持你的第二个建议。

    关于经理/部门关系,您主要有两种方法来表示这种关系。这两个解决方案都授权您保留递归的"经理管理员工"关系,以及可以实现的"经理管理部门"关系,如下所示:

    1-第一种/简单方法:在部门表中添加经理/员工ID。此字段当然是Employee表的外键

    2秒/更复杂的解决方案:添加一个"manager"表,其中包含以下字段:

    1
    2
    3
    4
    5
    Manager id (PK, surrogate)
    Department id (FK)
    Employee id (FK)
    beginningDate
    endingDate

    您将在哪里存储管理历史:谁、哪个部门、从何时到何时

    在这种情况下,不要忘记添加一些逻辑(触发器或客户端控制)来转换您的业务规则,例如您在特定期间只能有一个经理和一个特定部门,任何部门都不能停留超过…没有经理等。

    编辑:

    3-更丰富的解决方案将是我的第二个建议的概括,并允许你跟踪每个人在公司的职业生涯。你可以用"工作在"表来完成,比如这个表(我们在这里称之为"职位"表,我将在这里保留相同的术语:

    1
    2
    3
    4
    5
    6
    POSITION id (PK, surrogate)
    Department id (FK)
    Employee id (FK)
    POSITION Level (FK)
    beginningDate
    endingDate

    如果"职位级别"导致另一张表格,其中包含一个部门中可能存在的不同职位,其中一个当然是"经理"职位。

    此建议更接近于HR数据库和软件中使用的内容,您可能不需要如此复杂的解决方案。但请记住,将人分成多个表总是一个错误。

    编辑:根据您的评论…

    为了弄清楚,我建议你调整你的域名。我建议您使用以下字段:

    1
    Tbl_Employee.id_EmployeeManager

    1
    Tbl_Department.id_DepartmentManager

    这样,我们(或任何开发人员)将立即了解到,ID_EmployeeManager参与人与人之间的递归关系,而ID_DepartmentManager参与人与部门之间的关系。

    回到你的问题,根据我的说法,你不应该创建以下链接:

    1
    Tbl_Department.id_DepartmentManager -> Tbl_Employee.id_EmployeeManager

    这样做意味着,除非某人已经在管理员工,否则他就不能成为部门经理。只有一个员工的部门怎么办?对于一个新创建的部门,仍然没有分配员工的部门的经理,他们怎么办?它不起作用。正确的链接应该是:

    1
    Tbl_Department.id_DepartmentManager -> Tbl_Employee.id_Employee

    当然,您可以添加一些业务规则,例如"管理部门的员工只能是经理"(ID_Employee作为ID_EmployeeManager存在于某处)或"管理部门的员工不能有经理(此员工的ID_EmployeeManager为空…)。但这些只是商业规则。只要遵守基本规则(即部门由员工管理),您的数据模型就可以接受所有规则!


    坚持第二种设计并建立伪关系如何?

    我假设您在员工实体中有一个department_id列,用于链接员工和部门实体之间的关系。如果我们假设没有管理者层次结构(管理者的管理者),我们可以在两个表之间强制执行一个伪关系,其中department_idfor managers(Manager_ID为空)表示他们管理的部门。

    只要您清楚地记录这一点,我认为这将是一种节省空间的方法,因为您在引用部门实体的员工实体中已经有了一个FK列(department_id)。


    我认为最佳的解决方案:This is theP></

    DB DesignP></

    manages that is an雇员到经理在部门。递推关系You can get the by the next流:P></

    雇员has a部在部门经理雇员as has aP></

    也许它的方便给雇员在employeetype column to the table the角色定义。P></


    我的意见:P></

    人你在哪里会add table for both the信息雇员和经理,经理是人类太,你知道吗?你:),managerid to have a to the Field of the经理ID的链接。P></

    系部信息表with theP></

    和雇员,if the to that can属于一部黑莓,_部雇员创建table relate to them。if only to an雇员属于一部可以和你不需要更多的信息在关系比较,场雇员add a on the table。P></