我正在寻找以下关系的 3NF 形式:
1. emp_no -> phone_no, office_no, dep_no, proj_no
2. emp_no, date -> job, salary
3. phone_no -> dep_no, office_no, area
4. proj_no -> dep_no, p_buject
5. dep_no -> mgr_emp_no, d_budget
6. mgr_emp_no -> dep_no
我只能得出第一个依赖项:
1. emp_no -> phone_no, office_no, proj_no
因为proj_no
和phone_no
取决于dep_no
. 然后其余的不可分解,因此它们被复制到我的工作表上。
如您所见,5 和 6 相互依赖。我浏览了互联网上的资源,我以前从未见过这种关系(相互依赖和父母)。如何将这些功能依赖性转换为 3NF 格式?
要在 3NF 中引入模式,首先您必须找到依赖项的规范覆盖。然后,您可以应用“分析”算法来查找 Boyce-Codd 范式(比 3NF 更严格),或者您可以应用“综合”算法来查找 3NF。在这种情况下,两种算法都会给出相同的结果。
这是依赖项的规范封面:
让我们用合成算法找到 3NF。第一步是将具有相同左侧部分的规范覆盖的所有依赖项收集在一起,即:
第二步为每个组创建一个关系,其键由公共左侧部分给出:
第三步删除包含在另一个中的关系:在这种情况下,关系 R4 包含在 R2 中,因此删除 R4。
最后一步检查是否有任何关系包含原始关系的键之一,如果不是这样,则添加一个具有键之一的新关系:因为原始关系(仅)具有键(日期,emp_no),并且关系 R1 包含它,无需添加新关系。
所以 3NF 如下:
从这些关系中进行推理,您可以推断出每个关系所代表的实体以及指向其他关系的外键:
最后,请注意依赖项 4 和 5,即您称为“同一依赖项的多功能依赖项”,实际上是特殊的,因为它们在具有两个主键的关系(部门)中转换,部门和部门经理的编号。这是由第三步中的算法通过合并先前获得的两个关系来管理的(因此该关系具有两个主键)。