Отношения один-ко-многим в BiqQuery - PullRequest
0 голосов
/ 22 мая 2018

Предположим, у меня есть сущности A, B и C с one-to-many отношениями для хранения в BigQuery.

A -- (one to many) --> B --- (one to many) --> C

Для "обычной" базы данных SQL я бысоздать таблицы A, B и C с их первичными ключами и внешними ключами в A и B на основе первичных ключей B и C.

Будет ли этоработать на BigQuery?Не лучше ли денормализовать эту структуру и сохранить все A, B и C в одной таблице?

1 Ответ

0 голосов
/ 22 мая 2018

Допустим, каждый продукт может быть произведен на разных фермах, и в каждой ферме есть несколько разных сотрудников.

В 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

enter image description here

В: Имеет ли смысл моделировать его следующим образом?

A: Зависит.

Как говорит Ллойд:

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

Вложенные структуры - это, по сути, предварительно объединенные таблицы.И поскольку данные хранятся в столбчатом виде, если вы не ссылаетесь на вложенный столбец, к запросу не добавляются дополнительные расходы.Если вы ссылаетесь на вложенный столбец, логика идентична объединенному соединению.

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

Между тем запросы будут сложнее для пользователей и инструментов, не используемых для работы с вложенными данными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...