Объяснение 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
будет доступен со стабильной версией, будет два основных варианта использования, когда вы легко сможете выбрать между ними:
- Если вы работаете только с представлением JSON в своем приложении, PostgreSQL используется только для хранения и извлечения этого представления, вам следует использовать
json
, - Если вы выполняете много операций со значением 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. Давайте проверим на примере.
- JSON допускает пробелы, поэтому мы можем видеть пробелы при сохранении ключа "a", а JSONB - нет.
- JSON хранит все значения ключа. По этой причине вы можете видеть несколько значений (2 и 1) для клавиши "a", в то время как JSONB только "хранит" последнее значение.
- JSON поддерживает порядок, в котором элементы вставляются, а JSONB поддерживает "отсортированный" порядок.
- Объекты JSONB хранятся в виде распакованного двоичного файла, в отличие от "необработанных данных" в JSON, где повторный анализ данных не требуется во время поиска.
- jsonb также поддерживает индексирование, что может быть существенным преимуществом.
В общем, следует отдавать предпочтение JSONB, если нет особых потребностей, таких как устаревшие предположения о порядке расположения ключей объектов.
Что касается различий между json
а также jsonb
типов данных, стоит упомянуть официальное объяснение:
PostgreSQL предлагает два типа хранения данных JSON:
json
а такжеjsonb
. Чтобы реализовать эффективные механизмы запросов для этих типов данных, PostgreSQL также предоставляет тип данных jsonpath, описанный в Разделе 8.14.6.В
json
а такжеjsonb
типы данных принимают на вход почти идентичные наборы значений. Основное практическое отличие заключается в эффективности. Вjson
тип данных хранит точную копию входящего текста, которую функции обработки должны повторно анализировать при каждом выполнении; покаjsonb
данные хранятся в разложенном двоичном формате, что немного замедляет ввод из-за дополнительных накладных расходов на преобразование, но значительно ускоряет обработку, поскольку повторный анализ не требуется.jsonb
также поддерживает индексацию, что может быть значительным преимуществом.Поскольку
json
type хранит точную копию входящего текста, он сохранит семантически несущественные пробелы между токенами, а также порядок ключей в объектах 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