将多个值输入关系数据库字段

时间:2017-02-24 14:07:43

标签: mysql sql database

我正在为餐馆库存管理系统创建一个数据库应用程序。我目前有两个数据库表,一个用于配料,一个用于每个菜。

Database tables and relationships

每种成分都有一个唯一的ID,即表格的PK。而且'成分' DISH表中的字段是链接到ingredient_ID的外键。每道菜显然会有很多成分,但成分也可以属于多种菜肴。我在其他地方读过有关创建另一个名为ingredient_dish的表的例子,但我不确定我是否完全理解这是如何工作的。有人可能会指出我正确的方向或尝试解释请问,我在上表的加入表中会有哪些列?

非常感谢。

3 个答案:

答案 0 :(得分:1)

由于您在成分和菜肴之间存在多对多关系,因此您可能希望Ingredient_Dish成为交叉引用表。

其字段包括ingredient_id,Ingredients表的外键和dish_id,Dish表的外键。将此新表的主键设置为两个字段的组合。创建命令可能如下所示,根据需要进行定制:

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)

答案 1 :(得分:0)

您基本上是在描述桥接表。这是描述多对多关系而没有连接值的唯一方法(这是一种非常讨厌的蠕虫)。我建议你进一步阅读:

http://www.kimballgroup.com/2012/02/design-tip-142-building-bridges/

希望它有所帮助。

答案 2 :(得分:0)

多对多关系最好用这样的中间(或#34; bridge")表来完成。桥接表基本上由其他表的主键组成,以形成更大的"更大的"外键,允许您通过提供主键组合来实现多对多关系。

您的用例(简化)需要这样的表格:

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

"连接"成分的菜肴意味着在桥上添加一排。 "断开"来自成分的菜肴分别意味着删除这些行。

希望这有帮助。