Структуры базы данных - заполнение таблиц с помощью внешних ключей и суммирование - PullRequest
0 голосов
/ 17 марта 2019

Добрый день,

Я пытался придумать способы сделать это, но я до сих пор не мог придумать что-то солидное. В качестве последнего средства я решил спросить у блестящих умов о переполнении стека несколько советов о том, как мне это сделать. Некоторое предисловие, прежде чем я начну, я использую SMSS 18 и Microsoft SQL Server 2017.

Прежде всего, я покажу вам базу данных, которую я хочу достичь с помощью этого:

The database structure in question

  1. Должен ли я структурировать базу данных другим способом достижения того, чего я хочу достичь? (Способ записи блюд с суммированием всех калорий и т. Д.)
  2. Можно ли использовать внешние ключи для заполнения столбца во внешней таблице? Например. используя X в качестве первичного ключа, заполняя столбец Z (в другой таблице) Y в качестве внешнего ключа

  3. Как мне обернуть это и использовать SMSS для создания внешних ключей для автоматического выполнения этого?

  4. Можно ли делать суммирование в MSSQL? Я хотел получить сумму калорий в итоговой таблице еды, чтобы впоследствии я мог использовать эти данные в таблице для сравнения и создания представлений этих данных. Должен ли я позволить tableau сделать это или это возможно сделать с помощью MSSQL?

Я сейчас повсюду, знаю, что мои вопросы кажутся пугающими, но я рад предоставить гораздо больше информации, если вы что-то упустили.

У меня запланирован и спроектирован поток данных, но я не знаю, как именно реализовать эту архитектуру в MSSQL.

Заранее спасибо.

1 Ответ

0 голосов
/ 17 марта 2019

Ну, я думаю, это не совсем ответ на ваш вопрос ...

Я бы ожидал, что какая-то модель данных будет такой:

  • ингредиент (ингридиент_добавок, имя_ ингредиента, калории), жир, ...)
  • еда (еде_ид, имя еды)
  • еду_компонент (еду_ид, ингредиент_ид, количество)

За еду вы затем рассчитаете:

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, еды_id, потребление_дата, потребление_ количество)

И запрос для ежедневного потребления людей:

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.

...