我正在为我的数据库考试做一个项目,而且我陷入了一个棘手的问题。这是我的ER图的摘录:
正如您所看到的,实体Employee是Waiter和Cook的概括。主管服务员和首席厨师分别是服务员和厨师的专业。只有酋长才能向供应商填写订单(不包括在此摘录中)。只有一个酋长一次只能执行订单(我已经建立了一个Fulfillment关系,使图表不那么混乱)。
重新构建ER图(抱歉,如果我没有使用正确的单词,我正在翻译英文),结果就是这样:
因此,员工必须有一个角色(服务员,厨师或其他任何人),并且对于每个角色,(显然)只能有一个酋长。我真的不知道这是否正确,双重概括让我很困惑。
下一步是逻辑图(表格),这是一团糟! 这是一个可能的解决方案:
这是对关系模型的可能转换(在tblChief中对FK2使用Unique Not Null约束),但它有一个缺点:如果你在tblEmployee中更改Employees角色,tblChief将不会看到此错误,并且完整性将是破碎。可以在tblEmployee(Role)和tblChief(Role)之间添加FK是一个很好的解决方案吗?或者它会变得丑陋/凌乱吗?
我想到了第二种可能的解决方案。我更喜欢它,但我仍然不知道是否可以:
这里我将实体Role与实体Chief合并在一个表中。字段Chief引用了IDEmployee,它必须是Unique和Not Null。
这些解决方案是否正确?我确信在插入和更新Employees和Roles时会出现大问题(如果没有暂时删除完整性检查,则无法完成AFAIK)。可以用不同的方式完成吗?
很抱歉很长的帖子(以及图片链接,但我不能直接发布),非常感谢你能回答我:)
答案 0 :(得分:0)
最后一张图没有意义。
每位员工都有1个角色(这是FK关系)
每个角色都可以拥有一个优势角色。这是一个可以为空的FK关系,返回角色表。 (本身)。不是因为你有员工。
要查找作为经理的所有员工,您将拥有如下所示的选择语句:
SELECT *
FROM employees
WHERE roleID in (SELECT roleID
FROM role
WHERE superiorID IS NULL)
或
SELECT *
FROM employees E
LEFT JOIN role R ON E.roleID = R.roleID
WHERE R.superiorID IS NULL