2013-06-28 104 views
2

我在應用程序中有以下情況。多個外鍵

稱爲結構的實體,另一個稱爲客戶,另一個稱爲組織。所有這些實體具有可選0->ñ電話,所以,我創建了4桌

Structure 
ID_STRUCTURE (PK) 
NAME VARCHAR 

Customer 
ID_CUSTOMER (PK) 
RGI VARCHAR 

Organization 
ID_ORGANIZATION (PK) 
ALIAS VARCHAR 

Telephone 
ID_TELEPHONE 
NUMBER 
ID_STRUCTURE (FK) 
ID_CUSTOMER (FK) 
ID_ORGANIZATION (FK) 

一次爲期夷鍵總是有一個值,另外兩個總是充滿了空。

寄存器例如:

ID_TELEPHONE NUMBER ID_STRUCTURE ID_COSTUMER ID_ORGANIZATION 
     1  1234  1   null   null 
     2  4322  null  1   null 
     3  4333  null  null   2 
     4  4233  null  null   2  

我的DBA說,這是一種錯誤的做法(這不是歸一化)和sugest N:N表來避免這種nullables FK。但業務規則不允許N:N建議。但是這是關於正常化的討論。

我錯了,這種方法沒有正常化?或者這是正確的,沒有任何問題?

+0

當您有2個客戶使用同一個電話時會發生什麼? –

+0

號碼是唯一的,不會在整個表格中重複。 – jlemes

回答

2

由於ID_STRUCTURE ID_COSTUMER ID_ORGANIZATION的值取決於對方的值,因此未對其進行標準化。您必須確保3個屬性中只有一個不爲空。它浪費空間來存儲空值。

你可以試試這個方法

TelephoneOwner 
ID_Owner (PK) 

Telephone 
ID_TELEPHONE 
NUMBER 
ID_Owner (FK) 

Structure 
ID_STRUCTURE (PK) 
ID_Owner (FK) 

Customer 
ID_CUSTOMER (PK) 
ID_Owner (FK) 

Organization 
ID_ORGANIZATION (PK) 
ID_Owner (FK) 

添加新talbe TelephoneOwner。所有實體結構,客戶和組織都是所有者,因此爲它們添加ID_Owner字段。每部電話都可以由一個所有者擁有,因此也要添加一個ID_Owner字段。

當您添加一個新的實體(如結構)時,添加一個新的TelephoneOwner和一個新的結構。當實體接到電話時,將電話的ID_Owner設置爲實體的ID_Owner。

如果沒有關於所有權的其他特定信息(例如過期日期)以放入TelephoneOwner表中,則可以忽略TelephoneOwner表,並用ID_TELEPHONE替換實體的ID_Owner字段。

Telephone 
ID_TELEPHONE 
NUMBER 

Structure 
ID_STRUCTURE (PK) 
ID_TELEPHONE (FK) 

Customer 
ID_CUSTOMER (PK) 
ID_TELEPHONE (FK) 

Organization 
ID_ORGANIZATION (PK) 
ID_TELEPHONE (FK) 
+0

第一個解決方案很好,但是一個問題。總是我會有一個只有一列的表,用於解決這些外鍵空值的問題?聽起來對我來說很奇怪。第二個例子失敗,因爲力模型是1:1,關係是0:N可選否? – jlemes

+0

如果您有其他所有權信息,例如所有權何時開始以及所有權何時結束,那麼TelephoneOwner表將不會只有一列。否則,第二個模型解決了一列問題。它是否因爲你的數據庫管理系統不允許它或你的數據庫管理員說它是錯的而失敗?當TelephoneOwner表被合併到電話表中時,這兩個模型不一樣嗎? – Haoshu

+0

秒結束可能有0個或多個電話,因爲強制模型爲1:1會失敗。客戶可以有0個或多個電話。組織可以有0個或多個電話。結構不能像其他實體客戶和組織一樣重複自己。現在明白了 ?我用更多的欄目編輯我的問題 – jlemes