如果每个配方都有多种成分,并且每种成分只属于一个配方,那么您就有一对多关系。你应该像这样定义你的表:
+----------------+ +------------------+
| recipes | | ingredients |
+----------------+ +------------------+
| recipe_id <----------------+ | ingredient_id |
| recipe_name | | | ingredient_name |
| | +----------------+ recipe_id |
| | | |
| | | |
| | | |
| | | |
| | | |
+----------------+ +------------------+
注意ingredients 表如何有一个recipe_id 指向recipes 表中的配方。当你想查询属于一个食谱的所有成分时,你可以这样查询:
SELECT
*
FROM
recipes r
INNER JOIN ingredients i WHERE i.recipe_id = r.recipe_id
但是,这可能不是您想要的,因为您可能想要多次使用一种成分。在这种情况下,每种成分可以属于多个配方,并且每个配方可以具有多个成分。这是一个多对多关系。你应该像这样定义你的表:
+----------------+ +------------------+
| recipes | | ingredients |
+----------------+ +------------------+
| recipe_id <---+ +--> ingredient_id |
| recipe_name | | | | ingredient_name |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
+----------------+ | | +------------------+
| |
| +--------------------+ |
| | recipe_ingredients | |
| +--------------------+ |
| | id | |
+--+ recipe_id | |
| ingredient_id +--+
| quantity |
| type |
| |
| |
| |
| |
+--------------------+
注意额外的表格。这有时称为 bridge 表,它将recipe_id 与ingredient_id 相关联。这样,一种以上的成分可以与一种配方相关联,并且一种以上的配方可以与一种成分相关联。我还在桥接表中添加了两个额外的列,为关系添加了更多信息。我添加了一个quantity,它是要使用的成分的量,以及一个type,它可以用来定义测量类型(即杯子、克、茶匙等)。在这种情况下,当你想查询属于一个食谱的所有成分时,你可以这样查询:
SELECT
*
FROM
recipes r
INNER JOIN ingredients_recipes ir ON ir.recipe_id=r.recipe_id
INNER JOIN ingredients i ON i.ingredient_id=ir.ingredient_id