2017-04-05 45 views
1

我想了解何時將多個外鍵包含到表中以及何時使用關聯表。何時在單個表中使用多個外鍵與使用關聯表?

編輯:添加a diagram,希望能夠更容易理解。

我有一個設置系統,許多設置是特定於一個部門或分類。因此,例如,像「每隊人數」這樣的設置在第1分區A級比第3分區A級可能不同。第1分區A級比第1分區的「最低分數」可能不同C.顯然也有一些設置與我認爲應該在同一個表中的分區或分類無關。

所以我可以做到這一點的一種方法就是把div/class ID作爲FKs放在設置表中。然後,任何不依賴於其中一個或另一個的設置對於這些ID都是空的。

divisions 
---------- 
id (int) 
label (varchar) 
description (varchar) 

classification 
-------------- 
id (int) 
label (varchar) 
description (varchar) 

settings 
--------- 
id (int) 
division_id (int) (FK) 
class_id (int) (FK) 
key (varchar) 
value (varchar) 

由於只有一個組合的分類,分類和設置密鑰,應該工作,對嗎?但是這種「感覺」不知何故是錯誤的 - 就像在競爭對手的桌子上所有不同的事件一樣。我也不能保證他們不會拿出一些他們希望稍後應用設置的其他類別/類型。所以這讓我想這樣做:

divisions 
---------- 
id (int) 
label (varchar) 
description (varchar) 

classifications 
-------------- 
id (int) 
label (varchar) 
description (varchar) 

settings 
--------- 
id (int) 
key (varchar) 
value (varchar) 

settings_to_divisions 
------------------------- 
setting_id (int) 
division_id (int) 

settings_to_classifications 
------------------------------ 
setting_id (int) 
class_id (int) 

我認爲這將允許更容易生長,當他們拿出了一些新的類別(只創建「類」和「settings_to_categories」表)。但是,我可能會在設置表([id],「min_score」,5)和相關項目的多個幾乎相同的表(id,label,description)中有一整套幾乎重複的記錄 - 創建一個獨特的設置記錄。

然後當他們說他們想要男士和女士的不同設置時會發生什麼?我只是在設置表中添加一個額外的字段,並將'男性'和'女性'字符串硬編碼到記錄中,除了性別特定的設置外,其他位置都爲空。或者在事物的另一端,創建一個只有兩條記錄的單獨的「性別」表,並在用戶表中使用它?突然間,我在:

divisions 
--------- 
id (int) 
label (varchar) 
description (varchar) 

classifications 
--------------- 
id (int) 
label (varchar) 
description (varchar) 

categories 
---------- 
id (int) 
label (varchar) 
description (varchar) 

type 
---- 
id (int) 
label (varchar) 
description (varchar) 

gender 
------ 
id (int) 
label (varchar) 
description (varchar) 

settings 
--------- 
id (int) 
key (varchar) 
value (varchar) 

settings_to_divisions 
--------------------- 
setting_id (int) 
division_id (int) 

settings_to_classifications 
--------------------------- 
setting_id (int) 
class_id (int) 

settings_to_categories 
---------------------- 
setting_id (int) 
category_id (int) 

settings_to_type 
---------------- 
setting_id (int) 
type_id (int) 

settings_to_gender 
------------------ 
setting_id (int) 
gender_id (int) 

它開始感覺差不多... 過於標準化。雖然也許這只是我。

我只是試圖對此進行智能設計,即使某些設置適用於所有3區玩家,當他們告訴我他們需要更多類別,並且應用程序在3分類,A類,類別綠色,流氓,男性玩家vs女性玩家,我不需要重新設計我的數據庫或應用程序,以便輕鬆獲取/設置任何不同的設置。

我相信這不是一個新概念。這必須是某處公認的設計模式,但是很難嘗試尋找方法和方法來處理可能有3(或5或8)種關聯單個數據庫實體的不同方式的情況。

我目前傾向於關聯表方法(重要的標準化),但我並不是真正的DBA。那麼我在做一個愚蠢的設計決定?這種方法的負面和挑戰是什麼?還有一種不同的方法會更好嗎?

回答

0

這個職位是有點老,但我依然會回答未來的讀者:

答案很簡單:使用方法1

你需要部門之間的一個表中的唯一原因/分類是聯想到一個單個設置與多個部門/分類記錄。

我可以告訴你,你不想要的經驗。雖然反覆使用相同的設置聽起來像是一個很好的時間和空間節省機制,但您將來會後悔的。第二,您需要爲與單個設置關聯的子集記錄創建新設置,或者更糟糕的是,您需要更改設置表,以便強制絕大多數記錄將單個部門/分類記錄與單個關聯設置 - 你會恨你的生活。

其次,創建一個設置表的設置是文本字符串是非常靈活的,但不是過於高效。如果您對單個分部/分類有多個設置,則您的應用程序必須遍歷每條記錄上執行if語句的結果。

當然,替代方法是爲每個設置創建一個列。當新的設置需要部署時,這也可能是一個痛點。但是,如果很多設置都是布爾值,則可以獲得顯着的性能提升,但使用BIT值。

例子:

如果你有6個字段,數據庫引擎僅需要比較數據/記錄的一個字節 找到所需要的價值 - 對上,必須在多個記錄比較多字節的文本搜索。

最後,如果將來設置的數量顯着增加,則可能會使用文本字符串來影響性能。

相關問題