Допустим, каждый продукт может быть произведен на разных фермах, и в каждой ферме есть несколько разных сотрудников.
В BigQuery нет ничего плохого в том, что есть 3 таблицы и взаимосвязь между ними, но вы можете такжехочу воспользоваться поддержкой вложенных и повторяющихся столбцов BigQuery.
Для этого составного примера мы можем смоделировать его следующим образом:
SELECT 'tomato' produce, STRUCT<farm ARRAY<STRUCT<farm_id string, employee ARRAY<STRUCT<name string>>>>>(
[
STRUCT('farm1' AS farm_id, [STRUCT('employee1' AS name), STRUCT('employee2')] AS employee )
, ('farm2', [STRUCT('employee3' AS name), STRUCT('employee4')])
, ('farm3', [STRUCT('employee5' AS name), STRUCT('employee6')])
]) AS farms
UNION ALL
SELECT 'lettuce', STRUCT<ARRAY<STRUCT<farm_id string, employee ARRAY<STRUCT<name string>>>>>(
[
STRUCT('farm4' AS farm_id, [STRUCT('employee7' AS name), STRUCT('employee8')] AS employee )
, ('farm5', [STRUCT('employee9' AS name)])
]) AS farms
В: Имеет ли смысл моделировать его следующим образом?
A: Зависит.
Как говорит Ллойд:
Вложенные записи имеют несколько преимуществ при сканировании по распределенному набору данных.Во-первых, они не требуют соединений.Это означает, что вычисления могут выполняться быстрее и сканировать намного меньше данных, чем если бы вам приходилось каждый раз использовать дополнительные данные.
Вложенные структуры - это, по сути, предварительно объединенные таблицы.И поскольку данные хранятся в столбчатом виде, если вы не ссылаетесь на вложенный столбец, к запросу не добавляются дополнительные расходы.Если вы ссылаетесь на вложенный столбец, логика идентична объединенному соединению.
Другое преимущество, которое приносят вложенные структуры, состоит в том, что они избегают повторения данных, которые должны были бы повторяться в широкой денормализованной таблице.Другими словами, для человека, который жил в пяти городах, широкая денормализованная таблица будет содержать всю их информацию в пяти строках (по одной для каждого города, в котором они жили).Во вложенной структуре повторяющаяся информация занимает только одну строку, так как массив из пяти городов может содержаться в одной строке и только не быть вложенным при необходимости.
Между тем запросы будут сложнее для пользователей и инструментов, не используемых для работы с вложенными данными.