0

我正在为我的数据库考试做一个项目,但我陷入了一个棘手的问题。这是我的 ER 图的摘录:

http://i.stack.imgur.com/d1WQd.png

如您所见,实体 Employee 是 Waiter 和 Cook 的泛化。Head Waiter 和 Chief Cook 分别是 Waiter 和 Cook 的专长。只有酋长可以为供应商完成订单(不包括在此摘录中)。显然,一次只有一个酋长可以履行订单(我已经建立了一个履行关系以使图表不那么混乱)。

改造ER图后(对不起,如果我没有使用正确的单词,我正在翻译成英文),结果如下:

http://i.stack.imgur.com/GFOyD.png

因此,员工必须有一个角色(服务员、厨师或其他任何角色),并且每个角色(显然)可能只有一个酋长。我真的不知道这是否正确,双重概括让我很困惑。

下一步是逻辑图(表格),这完全是一团糟!这是一个可能的解决方案:

在此处输入图像描述

这是对关系模型的可能转换(在 tblChief 中对 FK2 具有唯一非空约束),但它有一个弱点:如果您更改 tblEmployee 中的员工角色,tblChief 将不会看到此错误并且完整性将被破坏。在 tblEmployee(Role) 和 tblChief(Role) 之间添加 FK 会是一个好的解决方案吗?还是会丑陋/凌乱?

我想到了第二种可能的解决方案。我更喜欢它,但我仍然不知道它是否可以:

在此处输入图像描述

在这里,我将实体 Role 与实体 Chief 合并到一个表中。字段 Chief 引用 IDEmployee,同样它必须是唯一且非空。

这些解决方案是否正确?我确信在插入和更新员工和角色时这将是一个大麻烦(AFAIK 如果不暂时删除完整性检查就无法完成)。这可以以不同的方式完成吗?

对不起,很长的帖子(以及图片链接,但我不能直接发布它们),如果你能回答我,非常感谢:)

4

1 回答 1

0

最后一张图没有意义。

每个员工都有 1 个角色(这是 FK 关系)

每个角色可以有一个上级角色。这是返回角色表的可为空的 FK 关系。(本身)。不要像你一样雇佣员工。

要查找所有作为经理的员工,您需要这样的 select 语句:

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
于 2012-07-16T00:21:44.940 回答