【问题标题】:How to design database to let users enter and save recipes如何设计数据库让用户输入和保存食谱
【发布时间】:2017-08-13 12:33:34
【问题描述】:

对于大学项目,我需要执行以下操作:

  1. 让用户通过 HTML 表单输入成分,通过 PHP 将其处理到我的 MySQL 数据库中。例如: 用户输入 EGG 和 QUANTITY 和 CALORIES。
  2. 让用户使用这些成分制作食谱。所以另一种带有食谱名称和成分的表格。

现在我的问题是:如何以正确的方式连接这些表?那么带有recipename 的tablerecipe 知道repiceid 1 由3 个鸡蛋、100g 牛肉和300g 奶酪组成?

我阅读了有关查找表的信息,但我不理解它们。任何帮助将不胜感激。

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

【问题讨论】:

  • @kittykittybangbang — 多对​​多。一个食谱有很多成分。一种成分可以用于许多不同的食谱。投入不同数量的复杂性。

标签: php html mysql database-design


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2014-09-28
    • 2011-03-14
    • 1970-01-01
    • 2016-09-22
    • 2011-06-23
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 2021-01-29
    相关资源
    最近更新 更多