我在ER中發現了一個案例,對於我而言,我無法弄清楚如何實現參照完整性。傳統的員工,經理,部門關係可以說明這個問題。在員工,經理和部門關係中實現參照完整性
有以下限制:
- 員工只能在一個部門工作。
- 部門可以有很多員工。
- 員工可以有一個經理在同一部門工作。
- 經理可以有許多員工在同一部門工作。
- 沒有經理的員工是經理。
該圖說明了這個概念。
正常化之前,我落得下表。
正常化後,我結束了這些表。
但是,仍然沒有什麼意外分配經理在一個部門工作,僱員在EmployeeManager
表中的不同部門工作,阻止我。
一個可能的解決方案,我發現是把繫到EmployeeManager
表和定義參考完整性約束,這樣{Manager, Department}
在EmployeeDepartment
表是指{Employee, Department}
。
然而,對於這個工作不{Manager, Department}
必須是一個候選鍵?有不同的設計可以解決這個問題嗎?
更新
好回答我的第一個問題,不{Manager, Department}
必須是一個候選鍵?事實證明EmployeeManager
表中的{Manager, Department}
不必是候選密鑰或唯一密鑰。它只是一個外鍵,引用EmployeeDepartment
表中的{Employee, Department}
。 {Employee, Department}
鑰匙的唯一性沒有明確定義,並且可能在不同的發動機之間有所不同。例如,MySQL建議外鍵僅引用唯一鍵。
此外,由於性能原因,MySQL要求對引用列進行索引。但是,系統不強制要求被引用的列是UNIQUE或被聲明爲NOT NULL。對包含NULL值的非唯一鍵或鍵的外鍵引用的處理對於UPDATE或DELETE CASCADE等操作沒有很好的定義。建議您使用僅引用UNIQUE(包括PRIMARY)和NOT NULL鍵的外鍵。
在我的情況下,它會工作,因爲員工可以在一個部門工作,僅但是如果約束的機會,讓員工在許多部門的工作將無法正常工作,因爲{Employee, Department}
將不再是唯一的。
它應該適用於所有情況,包括限制機會是否允許員工在多個部門工作。
有沒有不同的設計可以解決這個問題?我還考慮用ManagerDepartment
表替換EmployeeDepartment
表,其中{Manager}
作爲主鍵,然後回到之前的EmployeeManager
表和(Employee, Manager)
列。因此,現在要找出哪個部門的員工工作,您需要加入EmployeeManager
與ManagerDepartment
表。
您是否發現此設計有任何不良做法或異常?
啊是的!我沒有在EmployeeManager表中看到異常。這是否意味着它甚至不在2NF?第二個解決方案是擁有一個ManagerDepartment表,並更好地返回原始EmployeeManager表(Employee,Manager)? –