我們有多個辦事處,每個辦事處內有多個部門(有些部門在多個辦事處有員工)。我們有兩種現有的系統以不同的方式識別員工:一是員工由IDA識別;其他員工由IDB確定。如何強制執行可選的現有唯一鍵的參照完整性?
在員工由IDA識別的情況下,我們需要在SUPERVISOR_IDA中識別該員工的主管(如果有的話)。
我的表看起來像這樣:
IDA
IDB
SUPERVISOR_IDA
OFFICE
DEPARTMENT
員工可以有一個以上的辦公位置,或在多個部門,所以同樣IDA或IDB可能存在一次以上,但有不同的辦公室,部門或兩者。
問題是IDA可能爲空(如果是這樣,那麼IDB不爲空)或IDB可能爲空(如果是這樣,那麼IDA不爲空)或兩者都可以存在。
我試圖設置唯一的和/或主鍵和約束來確保數據庫的完整性。
所以我創建了一個唯一的密鑰(IDA,IDB,OFFICE,DEPARTMENT)。
這裏是我的問題:
我需要確保員工引用他們的上司。我想擁有一個自引用的外鍵,以便刪除主管不會留下擁有非空SUPERVISOR_IDA的孤兒員工記錄。但是因爲我需要包括IDB我在這個表上唯一的密鑰,如果我創造我需要包括IDB因此本外鍵:
local PARENT_IDA -> reference IDA
local OFFICE -> reference OFFICE
local DEPARTMENT -> reference DEPARTMENT
**local IDB -> reference IDB**
這是一個問題,因爲員工IDB不應該是與主管IDB相同。
我知道這似乎是我想在一張桌子上做太多事情,但實際上我的領域很難形容,所以我創建了員工/辦公室/部門作爲例子來說明我的問題。我真的不能將IDA和IDB分解成單獨的表格,因爲它們以一些有問題的方式交織在一起,並且一個,另一個或兩者的存在具有一些不能分開的重要含義。
首先,我想在除了上述唯一鍵之外還設置一個唯一鍵(IDA,OFFICE,DEPARTMENT),但與由單個列組成的唯一鍵不同,組合鍵將處理(空, 'A')和(空,'A')作爲副本,而不是允許空列避免違反唯一性約束。
使用觸發器來強化關係完整性不是一個好主意。它不能很好地擴展,並且在多用戶環境中中斷(因爲Oracle只允許具有READ COMMITTED隔離級別的事務。 – APC 2010-01-29 13:32:29