首页 > 解决方案 > 数据库结构 - 通过外键和求和填充表

问题描述

下午好,

我一直在尝试集思广益来做到这一点,但到目前为止我一直无法想到可靠的方法。作为最后的手段,我决定向堆栈溢出方面的聪明人请教一些关于我应该如何做到这一点的建议。开始之前的一些前言,我使用的是 SMSS 18 和 Microsoft SQL Server 2017。

首先,我将向您展示我想用这个实现的主干数据库:

有问题的数据库结构

  1. 我应该以另一种方式构建数据库来实现我想要实现的目标吗?(一种记录所有卡路里总和的膳食的方法,等等。)
  2. 是否可以使用外键填充外部表中的列?例如使用 X 作为主键,用 Y 作为外键填充 Z 列(在另一个表中)

  3. 我该如何包装它并使用 SMSS 创建外键来自动执行此操作?

  4. 是否可以在 MSSQL 中进行求和?我想获得最终膳食表中的卡路里总和,以便以后可以在 tableau 中使用该数据进行比较并创建该数据的表示形式。我应该让 tableau 这样做还是可以使用 MSSQL 这样做?

我现在到处都是,我知道我的问题似乎令人生畏,但如果您遗漏任何内容,我很乐意提供更多信息。

我已经规划和设计了数据流——但我不知道如何在 MSSQL 中准确地实现这种架构。

先感谢您。

标签: sqlsql-serverdatabaseforeign-keysssms

解决方案


好吧,我想这不是你问题的真正答案......

我希望有这样的数据模型:

  • 成分(成分 ID、成分名称、卡路里、脂肪……)
  • 膳食(meal_id,meal_name)
  • meal_ingredient (meal_id, ingredients_id, 数量)

然后,您将计算每餐:

select mi.meal_id, sum(i.calories * mi.amount), sum(i.fat * mi.amount)
from ingredient
join meal_ingredient mi on mi.ingredient_id = i.ingredient_id
group by mi.meal_id;

对于吃饭的人:

  • 人(person_id,姓名)
  • person_meal(person_id、meal_id、consume_date、consume_amount)

以及人们日常消费的查询:

select
  pm.person_id, pm.consume_date,
  sum(i.calories * mi.amount * pm.consume_amount),
  sum(i.fat * mi.amount * pm.consume_amount)
from ingredient
join meal_ingredient mi on mi.ingredient_id = i.ingredient_id
join person_meal pm on pm.meal_id, mi.meal_id
group by pm.person_id, pm.consume_date
order by pm.person_id, pm.consume_date;

我们不会重复存储结果,因为我们总是可以编写查询从表中获取它们。毕竟,这就是 SQL 的意义所在。


推荐阅读