You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 14:41:25