我正在为我正在玩的食谱网站构建SQL数据库。我是多对多风格的新手,对目前的情况并不自信。不可避免的是,我希望最终结果是在用户可以设置的基础上进行设置:
将食谱添加到数据库
按准备时间,烹饪时间,美食,类别,食物类别和课程排序
能够通过添加所选食谱中的成分总量,从每周膳食计划中生成购物清单。 (这是 最重要的!)
我将挑战自己,找出如何添加食谱中的成分以生成购物清单,但这篇文章的问题是“我应该如何构建表格并连接所有内容?”
这是我目前在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'似乎是相似的
提前谢谢!
答案 0 :(得分:3)
因为我不是100%确定你想要什么。我假设你问的是什么可能是你项目最好的数据库和表结构。由于我不完全确定项目的范围是什么,我只能根据项目名称的假设和项目结构的假设提供以下内容。
cook_time 时间
食物类别(表格)
food_category_id int primary_key auto_increment
food_category_name varchar
的场(表)强>
course_id int primary_key auto_increment
其他课程属性可能,例如一天中的时间?
的将成分(表)强>
ingredient_id int primary_key auto_increment
其他成分属性可能吗?
的数量(表)强>
quantity_id int primary_key auto_increment
ingredient_quantity 浮动
的测量(表)强>
measurement_id int primary_key auto_increment
measurement_name varchar
食谱步骤(表格)
step_id int primary_key auto_increment
当您加入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”课程的食谱,并且您尝试通过课程“早餐”来组织您的食谱,那么您将遇到一些有趣的问题而且您不得不忘记组织方法或操纵你的数据库以适应最初应该做的事情