【发布时间】:2019-09-11 02:46:43
【问题描述】:
我有以下情况,即我需要做一个数据库, 我将存储用户添加到早餐中的产品, 特定日期的午餐、午餐和晚餐。
我在构建这样一个关系数据库时遇到了问题。 我目前有两个表的组合:
在我看来,我需要 3 张桌子,其中 产品本身将被放置,但我不知道如何 我可以结合这 3 个表来获取查询 产品取决于膳食类型(早餐、午餐..)和日期(添加日期)
【问题讨论】:
我有以下情况,即我需要做一个数据库, 我将存储用户添加到早餐中的产品, 特定日期的午餐、午餐和晚餐。
我在构建这样一个关系数据库时遇到了问题。 我目前有两个表的组合:
在我看来,我需要 3 张桌子,其中 产品本身将被放置,但我不知道如何 我可以结合这 3 个表来获取查询 产品取决于膳食类型(早餐、午餐..)和日期(添加日期)
【问题讨论】:
是的,您应该有一个 Products 表,其中应该包含您在第二个表中显示的最后 5 列 (Orders?)。并从Orders 表中删除它们,使其只有引用Meal 和Product 和Date 的ID。
然后您可以执行以下操作:
SELECT o.Date, m.Meal_Name, p.Product_Name, p.Carbohydrates,
p.Protein, p.Fat, p.Calories
FROM Orders o
INNER JOIN Meals m ON o.MealID = m.MealID
INNER JOIN Products p ON o.ProductID = p.ProductID
ORDER BY o.date, m.Meal_Name, p.Product_Name
请注意,这将允许您轻松更改参数(例如 fat 或 Carbohydrates 为 Product 并使其出现在该产品的所有记录中。
【讨论】:
虽然这里肯定有很多解释空间,而且您可能只想对数据进行规范化,但我认为更好的选择是:
用餐:
id | user_id | category_id | date
1 | 1 | 1 | 2019-09-03
膳食类别
id | name
1 | breakfast
2 | lunch
3 | dinner
产品
id | name | carbs | protein | fat | calories
1 | apple| 10 | 5 | 0 | 30
2 | cat | 0 | 20 | 5 | 80
3 | ham | 10 | 30 | 10 | 160
餐品
meal_id | product_id
1 | 1
1 | 2
把这些放在一起:
SELECT meals.id, meals.user_id, meal.date, meal_category.name, product.name, product.carbs, products.protein, products.fat, products.calories
FROM meals
INNER JOIN meal_category ON meals.category_id = meal_category.id
INNER JOIN meal_produts ON meals.id = meal_products.meal_id
INNER JOIN products ON meal_products.product_id = products.id
哪个会成功
+-----------+----------------+------------+---------------------+---------------+----------------+-------------------+---------------+-------------------+
| meals.id, | meals.user_id, | meal.date, | meal_category.name, | product.name, | product.carbs, | products.protein, | products.fat, | products.calories |
+-----------+----------------+------------+---------------------+---------------+----------------+-------------------+---------------+-------------------+
| 1 | 1 | 9/3/2019 | breakfast | apple | 10 | 5 | 0 | 30 |
| 1 | 1 | 9/3/2019 | breakfast | cat | 0 | 20 | 5 | 80 |
+-----------+----------------+------------+---------------------+---------------+----------------+-------------------+---------------+-------------------+
【讨论】:
cat 最先出现。
meal_id 只是一个递增的整数,对于当天的那顿饭来说是唯一的(例如,星期四的早餐)。这是在meal 表中创建的,然后在关系表meal_products 中被引用,该表包含膳食和产品之间的1:many 关系。这打破了您最初认为meal 是breakfast on thursday 或lunch on monday 只是一个ID,其中lunch 和thursday 是属性category 和date
user 生成meal。为了跟踪哪个用户做了这顿饭,我添加了用户的 id 作为meals 表的属性。再说一次……如果您的模型中没有这样的概念,请忽略该列。我的假设是,您有一个尚未在此处共享的表来跟踪像 user_id | username | firstname | lastname | other attributes 这样的用户。