2017-02-24 47 views
1

我正在爲餐館庫存管理系統創建數據庫應用程序。我目前有兩張數據庫表,一張用於配料,另一張用於每道菜。將多個值輸入關係數據庫字段

Database tables and relationships

每個成分具有一個唯一的ID,其是該表的PK。 DISH表中的'成分'字段是鏈接到成分標識的外鍵。每道菜顯然有很多配料,但配料也可以屬於多道菜。例如,我已經閱讀過其他地方關於創建另一個名爲ingredient_dish的表,但我不確定我完全理解這是如何工作的。有人可能會指出我的方向正確,或者試圖解釋一下,我會在這張表的上面列出哪些列?

非常感謝。

回答

0

許多一對多的關係是最好的這樣的中間(或「橋」)表來完成。橋表基本上由其他表的主鍵組成,以形成「更大的」外鍵,這允許您通過提供主鍵組合來實現多對多關係。

你的使用情況(簡化的)將需要的表喜歡這些:

dishes: 
dish_id | other_columns 
------------------------- 
     1 | ... 
     2 | ... 
     3 | ... 

ingredients: 
ingredient_id | other_columns 
------------------------------- 
      1 | ... 
      2 | ... 
      3 | ... 

dishes_ingredients_bridge: 
dish_id | ingredient_id 
------------------------- 
     1 | 1 
     1 | 2 
     2 | 2 
     2 | 3 
     3 | 3 

這意味着你有3種菜餚和3層的成分,其中

  • 盤1由配料1和2
  • 碟2由成分2和3組成
  • 碟3僅包含成分3
  • 成分1只用在培養皿1
  • 成分2在菜1使用和2
  • 成分3中菜2使用和3

此外,確保在您的橋樑組合獨特(創建多列唯一鍵)。忽略它通常不會導致嚴重問題,但在某些邊緣情況下,您的應用程序可能會以未定義或意外的方式運行。

現在,您可以查詢(例如)這樣的菜1的所有成分:

SELECT i.* 
FROM ingredients as i 
LEFT JOIN dishes_ingredients_bridge dib 
ON dib.ingredient_id = dib.ingredient_id 
LEFT JOIN dishes as d 
ON d.dish_id = dib.dish_id 

「連接」一盤的成分意味着添加一行到橋樑。從配料中「斷開」菜餚意味着分別刪除這些行。

希望這會有所幫助。

+0

你是我的朋友,是一位救生員,這是我的Uni論文的一部分,你已經使它變得更清晰了,查詢這種語法不是我清楚的,我非常感謝! –

+0

不客氣。祝你好運! :)我剛剛認出了一個錯字,我會解決。 –

1

由於配料和菜餚之間有多對多的關係,因此您可能希望Ingredient_Dish成爲交叉參考表。

其字段包括Ingredient表的外鍵--edit_id和Dish表的外鍵dish_id。將這個新表的主鍵設置爲兩個字段的組合。一個創建命令可能看起來像下面對其進行定製,以滿足:

CREATE TABLE Ingredient_Dish (
    ingredient_id INT NOT NULL, 
    dish_id  INT NOT NULL, 
    CONSTRAINT PK_Ingredients_by_dish PRIMARY KEY (ingredient_id, dish_id)) 
ALTER TABLE Ingredient_Dish 
ADD CONSTRAINT FK_Ingredients FOREIGN KEY (ingredient_id) REFERENCES Ingredient (ingredient_id) 
ALTER TABLE Ingredient_Dish 
ADD CONSTRAINT FK_Dishess FOREIGN KEY (dish_id) REFERENCES Dish (dish_id)