【问题标题】:Relational database - adding products关系数据库 - 添加产品
【发布时间】:2019-09-11 02:46:43
【问题描述】:

我有以下情况,即我需要做一个数据库, 我将存储用户添加到早餐中的产品, 特定日期的午餐、午餐和晚餐。

我在构建这样一个关系数据库时遇到了问题。 我目前有两个表的组合:

在我看来,我需要 3 张桌子,其中 产品本身将被放置,但我不知道如何 我可以结合这 3 个表来获取查询 产品取决于膳食类型(早餐、午餐..)和日期(添加日期)

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:

    是的,您应该有一个 Products 表,其中应该包含您在第二个表中显示的最后 5 列 (Orders?)。并从Orders 表中删除它们,使其只有引用MealProductDate 的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
    

    请注意,这将允许您轻松更改参数(例如 fatCarbohydratesProduct 并使其出现在该产品的所有记录中。

    【讨论】:

      【解决方案2】:

      虽然这里肯定有很多解释空间,而且您可能只想对数据进行规范化,但我认为更好的选择是:

      用餐:

      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 最先出现。
      • 我必须诚实地承认我是第一次处理如此广泛的关系数据库,这就是为什么我会非常感谢回答以下问题:我了解与 products 表相关的所有内容和meal_category,但是... 1)meal_products 表的meal_id 列中隐藏了什么?她负责什么?因为 product_id 指的是 products 表中的产品。 2)我不明白饭菜表中的user_id列是什么,一定是吗?
      • 3) 假设我想在 2019 年 9 月 10 日的晚餐中添加 100g 鸡胸肉,其中 kcal = 98 蛋白质 = 21.5g 脂肪 = 1.3g 碳水化合物 = 0 这样的查询使用 INSERT 会是什么样子? 4) 假设我想收到 9 月 10 日晚宴的所有产品。这样的查询会是什么样子? 5) 假设我想修改 2019 年 9 月 10 日晚餐添加产品的常量营养素值,这样的查询会是什么样子?提前感谢您的任何帮助,因为我将能够做同样的事情并从中学习结论
      • 1) 这只是对您的实际数据的猜测。似乎用户做了一顿“饭菜”,而“饭菜”是在特定的一天。所以meal_id 只是一个递增的整数,对于当天的那顿饭来说是唯一的(例如,星期四的早餐)。这是在meal 表中创建的,然后在关系表meal_products 中被引用,该表包含膳食和产品之间的1:many 关系。这打破了您最初认为mealbreakfast on thursdaylunch on monday 只是一个ID,其中lunchthursday 是属性categorydate
      • 2) 这又是一个假设,即user 生成meal。为了跟踪哪个用户做了这顿饭,我添加了用户的 id 作为meals 表的属性。再说一次……如果您的模型中没有这样的概念,请忽略该列。我的假设是,您有一个尚未在此处共享的表来跟踪像 user_id | username | firstname | lastname | other attributes 这样的用户。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多