如何设计数据库让用户输入和保存食谱

时间:2017-03-21 17:14:06

标签: php html mysql database-design

对于大学项目,我需要做以下事情:

  1. 让用户通过HTML表单输入成分,通过PHP将其处理到我的MySQL数据库中。例如: 用户输入EGG和QUANTITY和CALORIES。
  2. 让用户使用这些成分制作食谱。所以另一种形式有recipename和成分。
  3. 现在我的问题是:如何以正确的方式连接这些表?所以用recipename的tablerecipe知道repiceid 1由3个鸡蛋,100克牛肉和300克奶酪组成?

    我读过关于查找表的内容,但我不明白它们。任何帮助将不胜感激。

    到目前为止,我的表结构如下所示:

    Database diagram

1 个答案:

答案 0 :(得分:0)

如果每种食谱都含有多种成分,并且每种成分只属于一种配方,那么您就拥有一对多关系。您应该像这样定义表:

+----------------+                                 +------------------+
| 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               |
                        |                    |
                        |                    |
                        |                    |
                        |                    |
                        +--------------------+

注意额外的表格。这有时称为网桥表,它会将recipe_idingredient_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