Database design for a recursive relationship
考虑一下这种情况,我正试图为一家公司建立一个数据库模型:
- 实体:
Employees 、Managers 、Departments 。 - 一个
Employee 只在1个Department 中工作,而一个Department 可能有许多Employees 在其中工作。 - 一个
Manager 只能管理一个Department ,同样,一个Department 只能管理一个Manager 。 - 一个
Manager 监督许多Employees ,但一个Employee 只由一个Manager 监督。
现在我有两种方法来建模:
第一个解决方案:
我将考虑
。
既然
Department 和Employee 之间的关系是1:N 那么我将把Department Id 作为Works 的Employee 表中的外键关系。既然
Department 和Manager 之间的关系是1:1 ,那么我将把Department Id 作为Manages 的Manager 表中的外键关系。
问题:如何表示
第二种解决方案:
我认为不需要
- 既然
Department 和Employee 之间的关系是1:N 那么我将把Department Id 作为Works 的Employee 表中的外键关系。 - 既然
Employee 和Manager 之间的关系是1:N 那么我将把Employee Id 作为Supervises 的Employee 表中的外键关系,称之为Manager Id 。
问题:我如何表示
问题:
我去与D类:东西probablyP></
P></
特点: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></
P></
因为_雇员ID必须是唯一globally,恩在一起组合cannot在the key with the百货_ ID。我们知道,而不是让交替使用the key and the _代孕雇员不在PK。P></
从这个模型,你有prevents经理部和工作在一个manages supervises主管,雇员,或从不同的部门。P></
在你不熟悉的房子象征with the…P></
P></
...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为空…)。但这些只是商业规则。只要遵守基本规则(即部门由员工管理),您的数据模型就可以接受所有规则!
坚持第二种设计并建立伪关系如何?
我假设您在员工实体中有一个
只要您清楚地记录这一点,我认为这将是一种节省空间的方法,因为您在引用部门实体的员工实体中已经有了一个FK列(
我认为最佳的解决方案:This is theP></
P></
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></