2011-10-11 88 views
0

我需要一個表來存儲工作項目。工作項目可以與我們的數據庫中的許多不同類型的現有實體中的一個相關聯,如人員,公司等。一種方式是將實體類型和實體ID存儲在兩列中以供參考。這是我以前做過的事情。另一種方法是爲每種類型的實體設置多個列。
在第一種方法中,應用程序必須維護關聯中的完整性約束。數據庫專家對第二種方法有偏好,因爲它可以具有FK約束,並且如果需要,還可以針對不同的實體ID使用不同的數據類型。很顯然,除了一列以外的每一行都會有一個空值。根據數據庫專家修改表格以添加新的參考不是問題,因此有很多空值。具有多個參考列的數據庫設計或具有參考類型和ID的兩列

在這一點上,我對這種方法沒有大的反對意見,但我仍然想問一下。 我的問題是,是否有充分的理由不應該使用第二種方法。

+0

人,公司和WorkItem之間的現實世界關係是什麼?人,是在這個項目上工作的人嗎?是該項目分配給誰的人?發起該項目的人是誰?與公司類似。人員和公司都可以與同一個WorkItem關聯嗎? – Thomas

+0

沒有,人與公司之間沒有關係。我們處理這兩件事情,並希望爲員工創建一個工作項目來完成一些工作。例如WI可能會更改該人的地址,另一個WI可能會退還給公司等。一個人和公司不能有相同的WI,WI只能有一個參考。我們還將爲WI分配用於專職工作人員的用戶列。 – softveda

+0

@Pratik,你的問題有11個句子。只有前兩句描述了這個問題;其餘的是你的意見, 你以前做過的事情,你的數據庫專家的意見等。 我們是否真的應該只從這兩句話中理解問題(你試圖建模的東西)? –

回答

0

如果2個值不爲空,該怎麼辦?

如果零值不爲空,該怎麼辦?

您需要添加業務邏輯以正確執行約束。

其他列的唯一好處是FK定義的默認數據庫級別約束。 缺點與所有非規範化的缺點相同。

我會避免不得不爲新數據條件更改模式,使用選項1,在觸發器中創建適當的業務邏輯以強制實施約束。

我的2美分

也:

認爲這是一個工作項目可能在某一時刻要與同類型的其他實體(如人)的多個關聯。

您忽略了另一個選項,即創建一個將work_item鏈接到人員(或多個 - 可能包含角色和狀態等)的新關聯表格,以及另一個用於work_item的關聯表格,你可以在這個中間表上強制執行FK約束,並且對你的業務邏輯也有一個好的地方。

+0

可以通過檢查約束來強制執行兩個或更多值不爲空。零值不爲空是允許的,因爲WI可以在沒有參考的情況下被創建並且稍後被修改以添加參考。 – softveda