Должны ли мои данные JSON содержать вложенное поле или дублирующуюся информацию? - PullRequest
0 голосов
/ 07 мая 2020

Я буду импортировать данные в файле JSON в Google BigQuery и хотел бы узнать, лучше ли вложить поля и добавить поле с режимом схемы «повторение», чтобы избежать дублирования или оставить дублированную информацию иметь меньше гнездовий. Еще одна причина оставить дублированную информацию, потому что, насколько я могу судить, BigQuery лучше всего работает с денормализованными данными. Однако я не уверен, должна ли эта денормализация выполняться после или до импорта данных.

Например, предположим, что мои данные:

Вложенная версия

{
   "store": "Pete's Market",
   "city": "NYC",
   "product": [
      {
          "id": "2468",
          "item": "apple",
          "price": "$1"
      },
      {
          "id": "1357",
          "item": "cereal",
          "price": "$3",
          "brand": "Cheerios"
      }
   ]
}

# The actual JSON data file will have this in one row:
# {"store":"Pete's Market","city":"NYC","product":[{"id":"2468","item":"apple","price":"$1"},{"id":"1357",item":"cereal","price":"$3","brand":"Cheerios"}]}

Дублированная версия информации

{
   "store": "Pete's Market",
   "city": "NYC",
   "product":
      {
          "id": "2468",
          "item": "apple",
          "price": "$1"
      }
}
{
   "store": "Pete's Market",
   "city": "NYC",
   "product":
      {
          "id": "1357",
          "item": "cereal",
          "price": "$3",
          "brand": "Cheerios"
      }
}

# The actual JSON data file will have this in two rows:
# {"store":"Pete's Market","city":"NYC","product":{"id": "2468","item":"apple","price":"$1"}}
# {"store":"Pete's Market","city":"NYC","product":{"id":"1357",item":"cereal","price":"$3","brand":"Cheerios"}}

Дополнительные примечания

Могут быть тысячи products, поле с повторением режима во вложенной версии. Некоторые products могут иметь поля, которых нет у других. Поля в каждом product могут иметь еще 2-3 вложенных уровня.

Повторяется вопрос

Лучше всего вкладывать поля и добавлять поле в режиме схемы «повторить» во избежание дублирования или оставить дублирующуюся информацию?

1 Ответ

0 голосов
/ 08 мая 2020

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

Незначительное разница в удобстве использования:

-- With nested schema
SELECT *  -- here all product's sub fields are entering parent namespace and no way to rename them in batch
FROM table, UNNEST(product) prd

Но если вы хотите обновить только определенный продукт позже, вложенный продукт делает это довольно трудным, поскольку нет возможности обновить отдельный элемент в поле REPEATED, вам нужно загрузить весь массив, сканирование и изменение, и переупаковка для обновления столбца. Вы напишете что-то вроде:

UPDATE table
SET product = (SELECT ARRAY_AGG(...) FROM UNNEST(Product) WHERE ...)
WHERE ... -- filter to specific products

В этом случае будет легче иметь дело с денормализованной формой.

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