如何在Recipe表中关联Recipe_type与Ingredients,解决主键重复问题
数据库表关联解决方案
先理清楚这几个表的核心关系:
- 菜谱和菜谱类型:要么是一个菜谱对应一种类型,一种类型对应多个菜谱(多对一),要么是一个菜谱能属于多种类型(多对多)
- 菜谱和食材:肯定是一个菜谱要用多种食材,一种食材能被多个菜谱用(多对多)
1. 菜谱与菜谱类型的关联
场景1:一个菜谱只属于一种类型
直接在Recipes表加个外键字段就行:
- 给
Recipes新增字段recipe_type_id,把它设为外键关联Recipe_type的id主键 - 这里出现重复的类型ID是正常的!外键本来就允许重复——多个菜谱用同一个类型完全符合规则,不用纠结这个问题
场景2:一个菜谱能属于多种类型
这种情况得加一张中间关联表(比如叫Recipe_Type_Link):
CREATE TABLE Recipe_Type_Link ( id INT PRIMARY KEY AUTO_INCREMENT, recipe_id INT, type_id INT, FOREIGN KEY (recipe_id) REFERENCES Recipes(id), FOREIGN KEY (type_id) REFERENCES Recipe_type(id), UNIQUE KEY (recipe_id, type_id) -- 防止同一个菜谱重复绑定同一个类型 );
2. 菜谱与食材的关联
别想着直接在Recipes里加食材ID字段了——一个菜谱要放多种食材,单个字段根本存不下,而且食材会被多个菜谱复用,必须用中间关联表来实现多对多关系。
新增一张中间表(比如Recipe_Ingredient_Link):
CREATE TABLE Recipe_Ingredient_Link ( id INT PRIMARY KEY AUTO_INCREMENT, recipe_id INT, ingredient_id INT, quantity VARCHAR(50), -- 可选:存食材用量,比如"150g"、"3瓣" unit VARCHAR(20), -- 可选:单独存单位,方便后续统计 FOREIGN KEY (recipe_id) REFERENCES Recipes(id), FOREIGN KEY (ingredient_id) REFERENCES Ingredients(id), UNIQUE KEY (recipe_id, ingredient_id) -- 防止同一个菜谱重复加同一种食材 );
最终的表结构总结
- Recipes:
id(主键)、name、time、difficulty、description、photo_url、amount_pax、recipe_type_id(外键,仅场景1保留) - Recipe_type:
id(主键)、name - Ingredients:
id(主键)、name - Recipe_Type_Link(仅场景2需要):
id(主键)、recipe_id(外键)、type_id(外键) - Recipe_Ingredient_Link:
id(主键)、recipe_id(外键)、ingredient_id(外键)、quantity(可选)、unit(可选)
内容的提问来源于stack exchange,提问作者Miriam Beltra
相关产品推荐
相关产品推荐

