我正在为餐馆库存管理系统创建一个数据库应用程序。我目前有两个数据库表,一个用于配料,一个用于每个菜。
Database tables and relationships
每种成分都有一个唯一的ID,即表格的PK。而且'成分' DISH表中的字段是链接到ingredient_ID的外键。每道菜显然会有很多成分,但成分也可以属于多种菜肴。我在其他地方读过有关创建另一个名为ingredient_dish的表的例子,但我不确定我是否完全理解这是如何工作的。有人可能会指出我正确的方向或尝试解释请问,我在上表的加入表中会有哪些列?
非常感谢。
答案 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的所有成分,如下所示:
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
"连接"成分的菜肴意味着在桥上添加一排。 "断开"来自成分的菜肴分别意味着删除这些行。
希望这有帮助。