2010-08-04 23 views
1

我一直在試圖找到答案,我不知道描述它的最佳方式。單橋表還是有更好的方法嗎?

基本上,我有3個源表,每個都有uniqueidentifier鍵。我們將這些表格稱爲Skill1,Duty2,Custom3。除了它們是特定工作的屬性之外,它們不以任何方式與對方相連(容易)。我想從現在的8個不同的表格(我將稱之爲Resource1 - Resource8)將這些技能與資源聯繫起來(例如:一本書,一個URL,一個課程ID)。這是爲了允許將這些類型的資源的任何組合鏈接到包含在所述3個「技能表」中的任何屬性。

我想出了很多奇怪的設計,但我在下面解決:

表 - 列 - > FK

Skill1 - SkillUniqueId -> BridgeTable.AttributeUniqueId 
Duty2 - DutyUniqueId -> BridgeTable.AttributeUniqueId 
Custom3 - CustomUniqueId -> BridgeTable.AttributeUniqueId 

BridgeTable - AttributeUniqueId, ResourceUniqueId, AttributeType, ResourceType 

Resource1 - ResourceUniqueId -> BridgeTable.ResourceUniqueId 
Resource2 - ResourceUniqueId -> BridgeTable.ResourceUniqueId 
Resource3 - ResourceUniqueId -> BridgeTable.ResourceUniqueId 
...etc. 

「問題」這個簡單的設計是我有一個將3個「屬性」表連接到8個資源表的橋接表,我必須在存儲過程(以及可能的應用程序使用這些表)中使用AttributeType和ResourceType,以便利用正確的表。

有沒有更好的方法將這3個屬性表連接到資源而不需要複製其他地方已存在的數據? (即:用所有可能的屬性組合來創建一個「工作」表,或將我的所有資源表拼湊成一個表,幷包含大量可爲空的列)

+0

爲什麼8個資源表?7我可以理解 - 技能,職責和習慣各爲3,技能和職責,職責和自定義,技能和自定義各加3分,全部爲1 3.什麼是第8張桌子? – 2010-08-04 17:13:57

+0

我需要的一些資源是內部業務資源...我不認爲我已經解釋得很好,因爲你能夠捕捉到我正在做的事情。這些資源描述了培訓資源(URL,書籍,內部培訓代碼,內部方法ID,LMS ID/URL等) – Andir 2010-08-04 17:33:29

回答

2

在第三種常規表單數據庫中,根據您的描述你需要一個連接每個屬性和每個可能的資源表的橋接表。任何類型的快捷方式(例如您提出的建議)都會導致問題(例如您發現的問題 - 有關此主題的優秀文章可以在SQL Server Central上找到,或者Google上的「MUCK表格」中找到。)

可在8資源表中的數據被修改爲一個表,是這樣的:

ResourceUniqueId 
ResourceType 
ResourceName 
ResourceEtc 

有可能是一個「類型」表來幫助定義/控制資源的類型?如果是這樣,那麼你只需要每個屬性表的一個橋表。

或者,也許一組類型子類型表可以幫助 - 頂級資源表,當前表被配置爲子類型。

如果失敗,控制非規範化可能會有所幫助。創建合併所有資源的單個表,然後將每個資源中的數據複製到其中。當然,非規範化的代價是當資源更新時(如果不更新),你必須保持它們在多個地方同步,如果更新頻繁,這可能是一個皇家噩夢。最終,如果您有複雜的數據,那麼您將需要複雜的模型和代碼來正確表示它。可以採取反規範化快捷方式,但是最先認識到它們是快捷方式,隨着時間的推移它們將需要額外的照顧,支持和維護。我在這個主題上聽到的最好的建議是首先產生完全和正確的規範化佈局,然後才引入可控的非規範化來支持你的目標。

+0

是的,我並不期望創建24個橋接表......此外,感謝關​​鍵字「肥料」!這就是我需要找到更多信息。 (在我使用非常通用的搜索術語之前,並沒有提供任何內容。)我試圖避免將資源全部放在一張桌子上。它們包含不同類型的數據(網址,ISBN#,ID等) – Andir 2010-08-04 17:30:04

0

希望這是不言自明的。

resource_model_v2

+0

這實際上是我測試的第一個設計之一,但我最大的「抱怨」是有人不理解什麼正在進行並將相同的資源ID放在Resource1和Resource3中。 ResourceType是我所指的外部邏輯。它可以工作,但它不是標準化的,並且不會強化設計中的數據完整性。 (我在上面的問題中列出的是沒有更好的...我不是說...) – Andir 2010-08-04 18:05:54

+0

看起來正常化給我。爲了強制執行獨佔子類型,可以將ResourceType添加到每個子類型表中,並對該類型使用檢查約束。稍後,加入ResourceId和ResourceType。 – 2010-08-04 18:15:35

+0

但是通過在資源表的每個記錄中放置該類型,可以將其解除規範化......這將起作用,我不會爭辯。 – Andir 2010-08-04 18:35:17

相關問題