创建配方数据库

时间:2016-07-19 15:57:11

标签: sql database-schema

我正在为我正在玩的食谱网站构建SQL数据库。我是多对多风格的新手,对目前的情况并不自信。不可避免的是,我希望最终结果是在用户可以设置的基础上进行设置:

  1. 将食谱添加到数据库

  2. 按准备时间,烹饪时间,美食,类别,食物类别和课程排序

  3. 能够通过添加所选食谱中的成分总量,从每周膳食计划中生成购物清单。 (这是     最重要的!)

  4. 我将挑战自己,找出如何添加食谱中的成分以生成购物清单,但这篇文章的问题是“我应该如何构建表格并连接所有内容?”

    这是我目前在SQL数据库中的内容:

    如果您认为自己有答案,请将您的表格与我的表格相似。我是一个视觉学习者,我将非常感激。此外,如果您可以解释我可能会丢失或不会丢失的内容,我们将不胜感激。

    - Recipe(table)
     - recipe_id (primary key)
     - recipe_name
     - recipe_description
     - course
     - food_category
     - cuisine
     - prep_time
     - cook_time
    
    - Ingredients(table)
     - ingredient_id (primary key)
     - ingredient_name
     - recipe_id (foreign key)
    
    - Quantity(table)
     - quantity_id (primary key)
     - recipe_id (foreign key)
     - ingredient_id (foreign key)
     - ingredient_quantity
     - ingredient_measurement
    
    - Recipe Steps(table)
     - step_id (primary key)
     - step_description
     - recipe_id (foreign key)
    
    - Join(table)*
     - join_id (primary key)
     - recipes_id(foreign key)
     - ingredients_id(foreign key)
     - quantity
    

    //我不知道我是否需要这个'join'表,因为'quantity'似乎是相似的

    提前谢谢!

1 个答案:

答案 0 :(得分:3)

因为我不是100%确定你想要什么。我假设你问的是什么可能是你项目最好的数据库和表结构。由于我不完全确定项目的范围是什么,我只能根据项目名称的假设和项目结构的假设提供以下内容。

数据库和表格结构


配方(表)

  • recipe_id int primary_key auto_increment
  • course_id int foreign_key
  • food_category_id int foreign_key
  • recipe_name varchar
  • recipe_description varchar
  • 不确定
  • prep_time 时间
  • cook_time 时间

    食物类别(表格)

  • food_category_id int primary_key auto_increment

  • food_category_name varchar

    场(表)

  • course_id int primary_key auto_increment

  • course_name varchar
  • 其他课程属性可能,例如一天中的时间?

    将成分(表)

  • ingredient_id int primary_key auto_increment

  • ingredient_name varchar
  • 其他成分属性可能吗?

    数量(表)

  • quantity_id int primary_key auto_increment

  • recipe_id int foreign_key
  • ingredient_id int foreign_key
  • ingredient_measurement_id int foreign_key
  • ingredient_quantity 浮动

    测量(表)

  • measurement_id int primary_key auto_increment

  • measurement_name varchar

    食谱步骤(表格)

  • step_id int primary_key auto_increment

  • recipe_id int foreign_id
  • step_number int
  • step_description varchar

当您加入SELECT查询中的表格时,加入表格毫无用处 即以下查询


示例查询


获取食谱详细信息 - 食谱查询
假设已输入搜索参数 - 即巧克力

SELECT
        r.recipe_id AS recipeID,
        r.recipe_name AS recipeName,
        r.recipe_description AS recipeDescription,
        r.cuisine AS cuisine,
        r.prep_time AS prepTime,
        r.cook_time AS cookTime,
        c.course_name AS course,
        f.food_category_name AS foodCategory
    FROM Recipe AS r
    JOIN course AS c ON c.course_id = r.course_id
    JOIN food_category AS fc ON fc.food_category_id = r.food_category_id
    WHERE r.recipe_name LIKE '%chocolate%'
        AND c.course_id = 1 -- i.e. breakfast as course_name
    ORDER BY r.prep_time -- for example

假设用户在名单中出现“巧克力”的食谱列表中选择了食谱(ID = 123

列出成分(使用用户选择的食谱中的recipeID)

SELECT
        i.ingredient_name AS ingredientName,
        q.ingredient_quantity AS ingredientQuantity,
        m.measurement_name AS measurementName
    FROM ingredients AS i
    JOIN quantity AS q ON q.ingredient_id = i.ingredient_id
    JOIN measurements AS m ON m.measurement_id = q.ingredient_measurement_id
    JOIN recipe AS r ON r.recipe_id = q.recipe_id
    WHERE r.recipe_id = 123
    ORDER BY i.ingredient_name ASC

列出步骤(使用用户选择的食谱中的recipeID)

SELECT
        s.step_number AS stepNo,
        s.step_description AS stepDescription
    FROM steps AS s
    JOIN recipe AS r ON r.recipe_id = s.recipe_id
    WHERE r.recipe_id = 123
    ORDER BY s.step_number ASC

<小时/> 附:您对数据库中内容的控制越多(即课程名称 - 您的初始结构不涉及对此内容的任何控制),最终将为您提供更好,更轻松的控制。例如:如果用户创建了一个带有“早餐”课程的食谱,另一个创建了一个带有“Brekfast”课程的食谱,并且您尝试通过课程“早餐”来组织您的食谱,那么您将遇到一些有趣的问题而且您不得不忘记组织方法或操纵你的数据库以适应最初应该做的事情