您将如何建模以下数据库关系?

时间:2012-06-18 15:19:41

标签: sql database-design

有部门和经理。一个部门有更多的经理,但只有一个经理是该部门的总经理。一个部门必须只有一名总经理。在假期期间,部门的总经理可以是另一个部门的临时总经理。你会如何模仿这个?

请解释您的选择。

5 个答案:

答案 0 :(得分:1)

假设一个“普通”经理最多可以管理一个部门,那么您的数据模型应该看起来像这样:

enter image description here

CHIEF_MANAGER_ID可以“指向”:

  • 来自同一部门的经理(即其MANAGER.DEPARTMENT_ID与包含此CHIEF_MANAGER_ID的行的DEPARTMENT.DEPARTMENT_ID匹配),在这种情况下,它是“主要”总经理
  • 或来自不同部门的经理,在这种情况下,它是“替代”首席经理。

如果您想确保同一个人无法管理多个部门作为总经理(同时仍然可以作为普通经理管理另一个部门),请在CHIEF_MANAGER_ID上添加UNIQUE约束。

如果您需要同时记住主要经理主要经理,请使用两个字段而不仅仅是CHIEF_MANAGER_ID(在这种情况下,您还必须强制部门匹配非声明)。

在上面的模型中,DEPARTMENT.CHIEF_MANAGER_ID为NULL。这样做是为了打破外键的循环,因此实际上可以将数据插入到数据库中而不延迟外键。如果您的DBMS支持可延迟约束,则可以将此字段设为NOT NULL并推迟其中一个FK,以便在事务结束时检查(在插入两行之后)。


我刚才意识到还有一个额外的要求:不是每个经理都可以替代。只有酋长可以。你可以做这样的事情来建模:

enter image description here

SUBSTITUTE_DEPARTMENT_ID指向我们“借用”总经理替代的部门。由于我们指的是一个部门,而不是直接经理,我们知道我们必须得到首席经理。

答案 1 :(得分:0)

一个部门表,一个管理员表,一个总经理表。

管理人员与部门之间的关系表,首席经理与部门之间的关系表,以及允许其他部门监督的首席经理关系表(或者,如果它导致较小的数据集,则表应该对于不允许监督的部门的首席经理来说是相互关联的。)

答案 2 :(得分:0)

你可以使用这个模型

系 ( IdDepartment, 其他物业...... )

管理器 ( Idmanager, 其他物业...... )

DepartmentManager ( IdDepartment, IdManager, 方法isTemporary )

在你的物理模型中

DepartmentTable
 IdDepartment作为主键

ManagerTable
 IdManager作为主键

DepartmentManagerTable   (IdDepartment + IdManager)作为主键   IsTemporaryChef作为财产

答案 3 :(得分:0)

一个部门表(包括总经理ID)

一张经理人表(每人)

一个部门/经理关系表(部门ID和经理ID)

示例:

Schema Example

答案 4 :(得分:0)

这里的主要思想是将组织结构图的层次结构与员工(经理是员工)分开。就像总统(职位)和担任职务的人之间的差异一样。

为简单起见,层次结构在这里用leveled-adjacency-list建模;对于SQL层次结构来说效率最高,但对此却足够好。

请注意,部门的总经理有一个职位,不向该部门的任何人报告。整个组织的首席执行官ReportsTo = NULL,其他所有人都指向老板的位置。

每位员工都可以随着时间的推移履行任何职责。

有关更高效的层次结构模型,请参阅Celko的书或只是谷歌的“SQL层次结构”。

enter image description here