【问题标题】:Database structures - populating tables via foreign keys and summation数据库结构 - 通过外键和求和填充表
【发布时间】:2019-03-17 11:26:42
【问题描述】:

下午好,

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

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

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

  3. 我该如何处理这个问题并使用 SMSS 创建外键来自动执行此操作?

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

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

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

提前谢谢你。

【问题讨论】:

  • 我不太了解这些表格。有食物,比如香蕉,它有一定的卡路里、脂肪等。然后我看到一个膳食 ID。我想象一顿饭由几个单一的食物组成。但我在您的数据库中没有看到这样的表。然后,您在多个表中都有卡路里、脂肪等。但这些不只是结果吗?不要存储结果。例如,如果你有一张饭桌,你可以很容易地编写一个查询来从食物表中获取每餐的卡路里。这个人是如何发挥作用的?
  • 静态表表示预先记录的食品以及它们各自的宏量营养素。我想要实现的是能够在第二张表中记录我们一顿饭中的多种食物,并从静态表中的数据中自动填充大量营养素。就人而言,我试图将一顿饭中的食物分配给一个人,其条形码标识符是从第三张表中填充的。我们希望最终表是第二个表中常量营养素的总和,其中包括在该表中创建的膳食标识符。
  • 您现有的数据模型是否存在问题?我唯一的反馈是我同意上面的@ThorstenKettner,关于你的第四个问题,除非有特定的限制,否则我会让 Tableau 进行求和,而不是将求和保存在单独的表中。另外,我不明白你想通过外键自动填充来实现什么?我假设您将拥有执行加载的 ETL 作业,并且通常该作业负责填充所有列。
  • 请通过编辑而非 cmets 进行澄清。请use text, not images/links, for text--including tables & ERDs. 仅将图像用于无法表达为文本或增强文本的内容。无法搜索或剪切和粘贴图像。使用编辑功能插入图像。请在每个帖子中提出一个问题。
  • 这还不清楚。什么是“我想要实现的”?还是“在外部表中填充一列”? “结束”什么? “自动做”什么?等等。使用足够多的单词、句子和对部分示例的引用来清楚完整地表达你的意思。说得足够多,有人可以离开并带着解决方案回来。为什么 1 googe 没有回答“是否可以在 MSSQL 中进行求和?”?请至少提出一些 SQL 设计。 minimal reproducible example 如果您对此还不够了解,那就跑题了。 How to Ask

标签: sql sql-server database foreign-keys ssms


【解决方案1】:

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

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

  • 成分(ingredient_id、成分名称、卡路里、脂肪...)
  • 膳食(meal_id,meal_name)
  • meal_ingredient (meal_id, ingredients_id, amount)

然后您将计算每餐:

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 的意义所在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-21
    • 2022-11-10
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多