0

我有一个想法,我想执行并且在涉及表之间的关系时对我的数据库设计非常生疏。我希望能够在 3 个<input type="text">字段中输入 3 种成分并搜索所有包含这些成分的食谱。

我有3张桌子...

  • 配料
  • 食谱
  • 菜单

粗体的列是我的主键,我希望斜体的列是外键。

示例 - iName 是 iName1 iName2 和 iName3 的主键。


配料

iName - iType

食谱

mName - iName1 - iName2 - iName3 - 方法

菜单

mName - mDiscription - 过敏


我的问题是......我的表之间的关系是否足够有效,可以满足我的需求?例如,如果我想加入查询会是什么

SELECT mName, mDiscripton, mAllergy
FROM menu
WHERE iName1 = input etc etc

对这个主题的任何启示都会有很大的帮助,我已经有一个表版本的数据库并且我使用的查询工作正常,我只想重新设计我的数据库并修改我的查询以适应。

4

2 回答 2

0

请不要使用 1..n 列来保存两个表之间的 n..m 连接。

由于您可以在不同的食谱中使用一种成分,因此您需要一个匹配的表格。这些通常称为table1_2_table2,或者在您的情况下称为recipe2ingredient。在那里你存储两个表的主键(在大多数情况下作为该表上的组合主键,因为它通常是有意义的)

菜单和食谱也应如此,因为您可能希望在多个菜单中使用一个食谱。

所以

Table 1 - Menu    (ID, Name, ... whatever columns you need on top of that)
Table 2 - Recipe (ID, Name, ...whatever columns you could desire)
Table 3 - Menu2Recipe( IdMenu, IdRecipe)
Table 4 - Ingredient (ID, Name, measurement unit)
Table 5 - Ingredient2Recipe( IdRecipe, IdIngredient, Amount )

我希望这对你来说有点清楚。

于 2013-01-15T13:20:09.827 回答
0

您的设计缺少一张桌子以提高效率;从您的配方表中删除 iName1 到 iName3 并添加一个映射表“recipe_ingredients”,其中包含配方和一种成分的外键。然后,对于每个食谱,您将在该表中拥有一到多行(看我的示例)。但是:您可以轻松搜索使用某种成分的所有食谱。如有必要,您可以在一份食谱中使用 10000 种成分。

餐桌菜单与食谱有何关联?菜单是否总是包含一个食谱?否则,还要为该关系添加一个映射表。

SELECT mName, mDiscription, mAllergy 
    FROM menu
        JOIN recipe ON recipe.mName = menu.mName
        JOIN recipe_ingredients ON recipe_ingredients.mName = recipe.mName
    WHERE recipe_ingredients.iName = 'whatever'
于 2013-01-15T13:21:58.917 回答