Dependencies

對同一依賴項的多個功能依賴項

  • August 23, 2016

我正在尋找以下關係的 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_nophone_no依賴於dep_no。然後其餘的不可分解,因此它們被複製到我的工作表上。

如您所見,5 和 6 相互依賴。我瀏覽了網際網路上的資源,我以前從未見過這樣的關係(相互依賴和父母)。如何使這些功能依賴於 3NF 格式?

要在 3NF 中引入模式,首先您必須找到依賴項的規範覆蓋。然後,您可以應用“分析”算法來找到 Boyce-Codd 範式(比 3NF 更嚴格),或者您可以應用“綜合”算法來找到 3NF。在這種情況下,兩種算法都給出相同的結果。

這是依賴項的規範封面:

date, emp_no → job
date, emp_no → salary
dep_no → d_budget
dep_no → mgr_emp_no
emp_no → phone_no
emp_no → proj_no
mgr_emp_no → dep_no
phone_no → area
phone_no → dep_no
phone_no → office_no
proj_no → dep_no
proj_no → p_buject

讓我們用綜合算法找到 3NF。第一步是將canonical Cover的所有依賴關係與左側相同的部分收集在一起,即:

date, emp_no → job
date, emp_no → salary

dep_no → d_budget
dep_no → mgr_emp_no

emp_no → phone_no
emp_no → proj_no

mgr_emp_no → dep_no

phone_no → area
phone_no → dep_no
phone_no → office_no

proj_no → dep_no
proj_no → p_buject

第二步為每個組創建一個關係,鍵由公共左側部分給出:

R1 (date, emp_no, job, salary)          key: (date, emp_no)
R2 (dep_no, d_budget, mgr_emp_no)       key: (dep_no)
R3 (emp_no, phone_no, proj_no)          key: (emp_no)
R4 (mgr_em_no, dep_no)                  key: (mgr_em_no)
R5 (phone_no, area, dep_no, office_no)  key: (phone_no)
R6 (proj_no, dep_no, p_buject)          key: (proj_no)

第三步刪除包含在另一個關係中的關係:在這種情況下,關係 R4 包含在 R2 中,因此刪除了 R4。

最後一步檢查是否有任何關係包含原始關係的鍵之一,如果不是,則添加具有其中一個鍵的新關係:因為原始關係(僅)具有鍵(日期,emp_no),並且關係 R1 包含它,不必添加新的關係。

所以 3NF 如下:

R1 (date, emp_no, job, salary)          key: (date, emp_no)
R2 (dep_no, d_budget, mgr_emp_no)       keys: (dep_no), (mgr_em_no)
R3 (emp_no, phone_no, proj_no)          key: (emp_no)
R5 (phone_no, area, dep_no, office_no)  key: (phone_no)
R6 (proj_no, dep_no, p_buject)          key: (proj_no)

並從這些關係中推理,您可以推斷出它們中的每一個代表的實體以及指向其他關係的外鍵:

R1 represents the history of jobs of the employee, with key: (date, emp_no),
   and emp_no as FK
R2 represents a department, which is identified by dep_no but also by the number 
   of the manager (which is a FK for employees)
R3 represents an employee, with key emp_no, with FKs phone_no and dep_no
R5 represents the “place” of an employee, with key phone_no and FK dep_no
R6 represents information about a project, with key proj_no and FK dep_no

最後,請注意依賴項 4 和 5,你稱之為“對同一依賴項的多個功能依賴”,實際上是特別的,因為它們在具有兩個主鍵的關係(部門)中轉換,即部門和部門經理的編號。這是由第三步中的算法通過合併先前獲得的兩個關係來管理的(因此該關係有兩個主鍵)。

引用自:https://dba.stackexchange.com/questions/147561