Объяснение JSONB, представленное PostgreSQL

PostgreSQL только что представил JSONB, и он уже имеет тенденцию к хакерским новостям. Было бы здорово, если бы кто-то мог объяснить, чем он отличается от Hstore и JSON, ранее присутствовавших в PostgreSQL. Каковы его преимущества и ограничения, и когда кто-то должен рассмотреть возможность его использования?

8 ответов

Первый, hstore это модуль contrib, который позволяет хранить только пары ключ => значение, где ключи и значения могут быть только text s (однако значения могут быть sql NULL тоже).

И то и другое json & jsonb позволяет хранить действительное значение JSON (определено в его спецификации).

F.ex. это допустимые представления JSON: null, true, [1,false,"string",{"foo":"bar"}], {"foo":"bar","baz":[null]} - hstore это всего лишь небольшое подмножество по сравнению с тем, на что способен JSON (но если вам нужно только это подмножество, это нормально).

Единственная разница между json & jsonb это их хранение:

  • json хранится в простом текстовом формате, в то время как
  • jsonb хранится в некотором двоичном представлении

Есть 3 основных последствия этого:

  • jsonb обычно занимает больше места на диске для хранения, чем json (иногда нет)
  • jsonb требуется больше времени для построения из его входного представления, чем json
  • json Операции занимают значительно больше времени, чем jsonb (& Разбор также должен выполняться каждый раз, когда вы выполняете json набрано значение)

когда jsonb будет доступен со стабильной версией, будет два основных варианта использования, когда вы легко сможете выбрать между ними:

  1. Если вы работаете только с представлением JSON в своем приложении, PostgreSQL используется только для хранения и извлечения этого представления, вам следует использовать json,
  2. Если вы выполняете много операций со значением JSON в PostgreSQL или используете индексирование для некоторого поля JSON, вам следует использовать jsonb,

Peeyush:

Краткий ответ:

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

Чтобы получить более длинный ответ, вам нужно подождать, пока я полностью напишу "HowTo", ближе к выпуску 9.4.

Простое объяснение разницы между json и jsonb ( оригинальное изображение от PostgresProfessional):

SELECT '{"c":0,   "a":2,"a":1}'::json, '{"c":0,   "a":2,"a":1}'::jsonb;

          json          |        jsonb 
------------------------+--------------------- 
 {"c":0,   "a":2,"a":1} | {"a": 1, "c": 0} 
(1 row)
  • JSON: текстовое хранилище "как есть"
  • JSONB: без пробелов
  • jsonb: нет повторяющихся ключей, выигрыш последнего ключа
  • jsonb: ключи отсортированы

Больше в речевом видео и презентации слайдов от разработчиков jsonb. Также они представили JsQuery, pg.extension предоставляет мощный язык запросов jsonb

  • hstore это скорее тип хранения "широкий столбец", это плоский (не вложенный) словарь пар ключ-значение, всегда хранящийся в достаточно эффективном двоичном формате (хеш-таблица, отсюда и название).
  • json хранит документы JSON в виде текста, выполняя проверку при сохранении документов и анализируя их при выводе (при обращении к отдельным полям); он должен поддерживать всю спецификацию JSON. Поскольку весь текст JSON хранится, его форматирование сохраняется.
  • jsonb использует быстродействие по соображениям производительности: данные JSON анализируются при вводе и сохраняются в двоичном формате, упорядочение ключей в словарях не поддерживается, а также дубликаты ключей. Доступ к отдельным элементам в поле JSONB быстрый, поскольку не требует постоянного анализа текста JSON. На выходе данные JSON восстанавливаются, и первоначальное форматирование теряется.

ИМО, нет веских причин не использовать jsonb как только он станет доступен, если вы работаете с машиночитаемыми данными.

JSONB является "лучшей" версией JSON. Давайте проверим на примере.

Сравнение по Prosfessional Postgres

  1. JSON допускает пробелы, поэтому мы можем видеть пробелы при сохранении ключа "a", а JSONB - нет.
  2. JSON хранит все значения ключа. По этой причине вы можете видеть несколько значений (2 и 1) для клавиши "a", в то время как JSONB только "хранит" последнее значение.
  3. JSON поддерживает порядок, в котором элементы вставляются, а JSONB поддерживает "отсортированный" порядок.
  4. Объекты JSONB хранятся в виде распакованного двоичного файла, в отличие от "необработанных данных" в JSON, где повторный анализ данных не требуется во время поиска.
  5. jsonb также поддерживает индексирование, что может быть существенным преимуществом.

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

Что касается различий между json а также jsonb типов данных, стоит упомянуть официальное объяснение:

PostgreSQL предлагает два типа хранения данных JSON: json а также jsonb. Чтобы реализовать эффективные механизмы запросов для этих типов данных, PostgreSQL также предоставляет тип данных jsonpath, описанный в Разделе 8.14.6.

В json а также jsonbтипы данных принимают на вход почти идентичные наборы значений. Основное практическое отличие заключается в эффективности. В jsonтип данных хранит точную копию входящего текста, которую функции обработки должны повторно анализировать при каждом выполнении; покаjsonb данные хранятся в разложенном двоичном формате, что немного замедляет ввод из-за дополнительных накладных расходов на преобразование, но значительно ускоряет обработку, поскольку повторный анализ не требуется. jsonb также поддерживает индексацию, что может быть значительным преимуществом.

Поскольку jsontype хранит точную копию входящего текста, он сохранит семантически несущественные пробелы между токенами, а также порядок ключей в объектах JSON. Кроме того, если объект JSON в значении содержит один и тот же ключ более одного раза, все пары ключ / значение сохраняются. (Функции обработки рассматривают последнее значение как рабочее.) Напротив,jsonbне сохраняет пробелы, не сохраняет порядок ключей объектов и не сохраняет повторяющиеся ключи объектов. Если во входных данных указаны повторяющиеся ключи, сохраняется только последнее значение.

Как правило, большинство приложений предпочитают хранить данные JSON как jsonb, если нет достаточно специализированных потребностей, таких как устаревшие предположения об упорядочивании ключей объектов.

PostgreSQL допускает только одну кодировку набора символов для каждой базы данных. Таким образом, типы JSON не могут строго соответствовать спецификации JSON, если только кодировка базы данных не UTF8. Попытки напрямую включить символы, которые не могут быть представлены в кодировке базы данных, потерпят неудачу; и наоборот, будут разрешены символы, которые могут быть представлены в кодировке базы данных, но не в UTF8.

Источник: https://www.postgresql.org/docs/current/datatype-json.html

Сегодня я был в pgopen, тесты намного быстрее, чем в mongodb, я считаю, что для избранных он был примерно на 500% быстрее. Практически все было быстрее, по крайней мере, на 200% по сравнению с mongodb, чем одно исключение в настоящий момент - это обновление, которое требует полностью переписать весь столбец json, что-то, что mongodb обрабатывает лучше.

Индексирование джина на jsonb звучит потрясающе.

Кроме того, postgres будет внутренне сохранять типы jsonb и в основном сопоставлять их с такими типами, как числовой, текстовый, логический и т. Д.

Присоединения также будут возможны с помощью jsonb

Добавьте PLv8 для хранимых процедур, и для разработчиков node.js это будет мечтой.

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

Кроме того, индекс при запросе к столбцу json, сопоставленному со столбцом json, postgres не должен на самом деле запускать функцию преобразования текста в json в каждой строке, что, вероятно, сэкономит в одиночку огромное количество времени.

Другое важное отличие, которое не упоминалось ни в одном ответе выше, заключается в том, что для равенства нет оператора равенства. json типа, но есть один для jsonb,

Это означает, что вы не можете использовать DISTINCT ключевое слово при выборе этого json -тип и / или другие поля из таблицы (вы можете использовать DISTINCT ON вместо этого, но это не всегда возможно из-за подобных случаев).

Насколько я могу сказать,

  • hstore в том виде, в котором он существует в настоящее время (в Postgresql 9.3), не допускает вложение других объектов и массивов в качестве значений его пар ключ / значение. Тем не менее, будущий патч hstore позволит использовать вложения. этот патч не будет выпущен в версии 9.4 и может быть не включен в ближайшее время.

  • json в том виде, в каком он существует в настоящее время , допускает вложение, но основывается на тексте и не допускает индексацию, поэтому он "медленный"

  • jsonb, который будет выпущен с 9.4, будет иметь текущие возможности вложения json, а также индексирование GIN/GIST hstore, так что это будет быстро

Люди, работающие над postgresql 9.4, похоже, говорят, что новый быстрый тип jsonb понравится людям, которые выбрали бы хранилище данных noSQL, например MongoDB, но теперь могут объединять реляционную базу данных с неструктурированными данными с возможностью запроса под одной крышей.

http://www.databasesoup.com/2014/02/why-hstore2jsonb-is-most-important.html

Тесты postgresql 9.4 jsonb, кажется, находятся на одном уровне или в некоторых случаях быстрее, чем MongoDB

http://texture.io/alphabetum/postgresql-incl-hstore-vs-mongodb

Другие вопросы по тегам