2013-12-19 88 views
0

我正在創建一個MySQL數據庫,並且遇到了一個需要多態關聯的實例......很明顯,SQL不支持這個,所以我決定爲每個外鍵創建一個列;發現下面:試圖避免多態關聯

CREATE TABLE mixers (
mixers_id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, 
name VARCHAR(255) NOT NULL, 
0_booze_id INT(11), 
0_gen_booze_id INT(11), 
0_gen_soda_id INT(11), 
0_soda_id INT(11), 
1_booze_id INT(11), 
1_gen_booze_id INT(11), 
1_gen_soda_id INT(11), 
1_soda_id INT(11), 
2_booze_id INT(11), 
2_gen_booze_id INT(11), 
2_gen_soda_id INT(11), 
2_soda_id INT(11), 
3_booze_id INT(11), 
3_gen_booze_id INT(11), 
3_gen_soda_id INT(11), 
3_soda_id INT(11), 
4_booze_id INT(11), 
4_gen_booze_id INT(11), 
4_gen_soda_id INT(11), 
4_soda_id INT(11), 
5_booze_id INT(11), 
5_gen_booze_id INT(11), 
5_gen_soda_id INT(11), 
5_soda_id INT(11), 
6_booze_id INT(11), 
6_gen_booze_id INT(11), 
6_gen_soda_id INT(11), 
6_soda_id INT(11), 
7_booze_id INT(11), 
7_gen_booze_id INT(11), 
7_gen_soda_id INT(11), 
7_soda_id INT(11), 
8_booze_id INT(11), 
8_gen_booze_id INT(11), 
8_gen_soda_id INT(11), 
8_soda_id INT(11), 
9_booze_id INT(11), 
9_gen_booze_id INT(11), 
9_gen_soda_id INT(11), 
9_soda_id INT(11), 
FOREIGN KEY (0_booze_id) REFERENCES booze(booze_id), 
FOREIGN KEY (1_booze_id) REFERENCES booze(booze_id), 
FOREIGN KEY (2_booze_id) REFERENCES booze(booze_id), 
FOREIGN KEY (3_booze_id) REFERENCES booze(booze_id), 
FOREIGN KEY (4_booze_id) REFERENCES booze(booze_id), 
FOREIGN KEY (5_booze_id) REFERENCES booze(booze_id), 
FOREIGN KEY (6_booze_id) REFERENCES booze(booze_id), 
FOREIGN KEY (7_booze_id) REFERENCES booze(booze_id), 
FOREIGN KEY (8_booze_id) REFERENCES booze(booze_id), 
FOREIGN KEY (9_booze_id) REFERENCES booze(booze_id), 
FOREIGN KEY (0_gen_booze_id) REFERENCES gen_booze(gen_booze_id), 
FOREIGN KEY (1_gen_booze_id) REFERENCES gen_booze(gen_booze_id), 
FOREIGN KEY (2_gen_booze_id) REFERENCES gen_booze(gen_booze_id), 
FOREIGN KEY (3_gen_booze_id) REFERENCES gen_booze(gen_booze_id), 
FOREIGN KEY (4_gen_booze_id) REFERENCES gen_booze(gen_booze_id), 
FOREIGN KEY (5_gen_booze_id) REFERENCES gen_booze(gen_booze_id), 
FOREIGN KEY (6_gen_booze_id) REFERENCES gen_booze(gen_booze_id), 
FOREIGN KEY (7_gen_booze_id) REFERENCES gen_booze(gen_booze_id), 
FOREIGN KEY (8_gen_booze_id) REFERENCES gen_booze(gen_booze_id), 
FOREIGN KEY (9_gen_booze_id) REFERENCES gen_booze(gen_booze_id), 
FOREIGN KEY (0_gen_soda_id) REFERENCES gen_soda(gen_soda_id), 
FOREIGN KEY (1_gen_soda_id) REFERENCES gen_soda(gen_soda_id), 
FOREIGN KEY (2_gen_soda_id) REFERENCES gen_soda(gen_soda_id), 
FOREIGN KEY (3_gen_soda_id) REFERENCES gen_soda(gen_soda_id), 
FOREIGN KEY (4_gen_soda_id) REFERENCES gen_soda(gen_soda_id), 
FOREIGN KEY (5_gen_soda_id) REFERENCES gen_soda(gen_soda_id), 
FOREIGN KEY (6_gen_soda_id) REFERENCES gen_soda(gen_soda_id), 
FOREIGN KEY (7_gen_soda_id) REFERENCES gen_soda(gen_soda_id), 
FOREIGN KEY (8_gen_soda_id) REFERENCES gen_soda(gen_soda_id), 
FOREIGN KEY (9_gen_soda_id) REFERENCES gen_soda(gen_soda_id), 
FOREIGN KEY (0_soda_id) REFERENCES soda(soda_id), 
FOREIGN KEY (1_soda_id) REFERENCES soda(soda_id), 
FOREIGN KEY (2_soda_id) REFERENCES soda(soda_id), 
FOREIGN KEY (3_soda_id) REFERENCES soda(soda_id), 
FOREIGN KEY (4_soda_id) REFERENCES soda(soda_id), 
FOREIGN KEY (5_soda_id) REFERENCES soda(soda_id), 
FOREIGN KEY (6_soda_id) REFERENCES soda(soda_id), 
FOREIGN KEY (7_soda_id) REFERENCES soda(soda_id), 
FOREIGN KEY (8_soda_id) REFERENCES soda(soda_id), 
FOREIGN KEY (9_soda_id) REFERENCES soda(soda_id) 
)ENGINE=InnoDB; 

我想這樣做,是設置表,以便爲每個組的成分 -

0_booze_id INT(11), 
0_gen_booze_id INT(11), 
0_gen_soda_id INT(11), 
0_soda_id INT(11) 
  • 只能使用一列(三列必須爲空)或者所有四個組必須爲空。

是否有可能創建類似這樣的? 如果不是,那麼更好的解決方案是什麼?

編輯 澄清 - 我正在做一個自動飲料攪拌機器人。我試圖創建一個數據庫,允許在沒有特定成分的情況下使用通用成分。

例如,如果配方需要「傑克」和「可樂」,並且我有可用的成分「傑克」和「可樂」,那麼我會想要使用這些特定的成分。然而,可以說我有一些可口可樂,我想用可樂代替。我希望專門爲「傑克」和「可樂」調用的食譜能夠用「可樂」代替「普通可樂」。

我的目的是創建兩個通用表格,一個用於汽水,另一個用於豪飲「gen_soda」「gen_booze」。這些表格將包含諸如「可樂」,「威士忌」,「伏特加」等項目。表格汽水和酒會含有特定的成分名稱,如「可樂」或「傑克丹尼爾斯」;這些項目將被引用回它們的泛型類型。

我最初發布的攪拌機表包含了機器人知道如何製作的所有各種混合飲料。應該提供的唯一混合飲料是具有特定成分的飲料。這就是我遇到術語多態關聯的原因。

+2

嗯,規範化任何人? – Strawberry

+2

你的表格看起來非常不規範。你能用簡單的語言描述你想要的數據嗎(避免像「多態關聯」這樣的術語)?這通常有助於構建數據模型。 –

+0

我試圖在我的編輯中描述我的最終目標。如果你需要更多的細節,請讓我知道,我可以嘗試澄清我自己多一點。 – kubiej21

回答

2
CREATE TABLE mixers (
    mixer_id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    mixer_name VARCHAR(255) NOT NULL, 
) 

CREATE TABLE ingredients (
    ingredient_id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    ingredient_name VARCHAR(255) NOT NULL, 
) 

CREATE TABLE mixer_ingredients 
    mixer_id INT(11) NOT NULL, 
    ingredient_id INT(11) NOT NULL, 
    PRIMARY KEY (mixer_id, ingredient_id), 
    FOREIGN KEY (mixer_id) REFERENCES mixers(mixer_id), 
    FOREIGN KEY (ingredient_id) REFERENCES ingredients(ingredient_id), 
) 
+0

我花了一段時間瞭解這裏發生了什麼,但現在我已經考慮了這幾天,現在這一切都有意義。謝謝您的幫助! – kubiej21

0

我明白你想要做什麼,但認爲這是錯誤的做法。您的數據模型需要更好地適合您的問題。

首先,開始與成分表,與像列:

  • ingredientId
  • ingredientName
  • ingredientType

然後MixedDrink表:

  • MixedDrinkId
  • MixedDrinkName

然後,在MixedDrinkIngredient表:

  • MixedDrinkIngredientId
  • MixedDrinkId
  • IngredientId

所以,這個處理的混合飲料沒有換人。你如何表達他們?

好了,在這一點上,你需要做出一些決定。替代通用爲成分?或者是一些MixedDrinks而不是其他的替代物?根據這些問題的答案,取決於您需要的規則,替代信息可能會在MixedDrinkIngredients,Ingredients或兩者中出現。

順便說一下,酒精和蘇打之間的區別嵌入type信息Ingredients。這是一種簡化,您可能實際上需要一個層次結構,並在層次結構中的特定位置進行替換。例如,你可能願意用百事可樂替代可口可樂,而不是薑汁啤酒。

+0

我很感激幫助,但我現在有點困惑。爲了回答你的問題,我的意圖是能夠用可口可樂或法伊可樂等其他特定成分代替可口可樂,或用普通可口可樂類型代替可口可樂(如果特定成分未添加到數據庫)。所以,我想我失去了替代信息應該進入哪個表。查看您對MixedDrinkIngredient的建議,當只有一個IngredientID列時,如何包含多個成分? – kubiej21