PostgreSQL только что представил JSONB, и он уже в тренде на хакерских новостях . Было бы здорово, если бы кто-то мог объяснить, чем он отличается от Hstore и JSON, ранее присутствовавших в PostgreSQL. Каковы его преимущества и ограничения и когда кто-то должен рассмотреть возможность его использования?
json
postgresql
nosql
postgresql-json
jsonb
Peeyush
источник
источник
Ответы:
Во-первых,
hstore
это модуль contrib, который позволяет хранить только пары ключ => значение, где ключами и значениями могут быть толькоtext
s (однако значения также могут быть sqlNULL
s).Обе
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
.jsonb
.источник
jsonb
не поддерживает это?UPDATE test SET data->'a' = 123 WHERE id = 1;
отCREATE TABLE test(id SERIAL PRIMARY KEY, data JSONB);
json
болееjsonb
, если для устаревших причин вашего кода потребляя вашjson
зависят от упорядоченияjson
полей , и они не могут быть перераспределены.text
против»json
: последний поставляется с проверкой JSON, поэтому при неправильном JSON произойдет сбой только при вставке, а не каждый раз, когда ваше приложение читает его (потому что оно получает недопустимое представление). Кроме того, вы можете безопасно привести последнееjsonb
в базу данных.Peeyush:
Краткий ответ:
Чтобы получить более длинный ответ, вам нужно подождать, пока я полностью выпишу «HowTo», ближе к выпуску 9.4.
источник
Простое объяснение разницы между json и jsonb ( оригинальное изображение от PostgresProfessional ):
Больше в речевом видео и презентации слайдов от разработчиков jsonb. Также они представили JsQuery , pg.extension предоставляет мощный язык запросов jsonb
источник
hstore
это больше тип хранения «широкий столбец», это плоский (не вложенный) словарь пар ключ-значение, всегда хранящийся в достаточно эффективном двоичном формате (хеш-таблица, отсюда и название).json
сохраняет документы JSON в виде текста, выполняя проверку при сохранении документов и анализируя их при выводе (например, обращаясь к отдельным полям); он должен поддерживать всю спецификацию JSON. Поскольку весь текст JSON хранится, его форматирование сохраняется.jsonb
использует быстродействие по соображениям производительности: данные JSON анализируются при вводе и сохраняются в двоичном формате, упорядочение ключей в словарях не поддерживается, а также дубликаты ключей. Доступ к отдельным элементам в поле JSONB быстрый, так как не требует постоянного анализа текста JSON. При выводе данные JSON восстанавливаются, и первоначальное форматирование теряется.IMO, нет существенной причины не использовать
jsonb
его, если он доступен, если вы работаете с машиночитаемыми данными.источник
JSONB - это «лучшая» версия JSON.
Давайте посмотрим на пример:
В общем, следует отдавать предпочтение JSONB, если нет особых потребностей, таких как устаревшие предположения о порядке расположения ключей объектов.
источник
Я был на pgopen сегодня, тесты намного быстрее, чем mongodb, я думаю, что он был примерно на 500% быстрее для избранных. Практически все было быстрее, по крайней мере, на 200% по сравнению с mongodb, чем одно исключение в настоящий момент - это обновление, которое требует полностью переписать весь столбец json, что-то, что mongodb обрабатывает лучше.
Индексирование джина на jsonb звучит потрясающе.
Также postgres будет внутренне сохранять типы jsonb и в основном сопоставлять их с такими типами, как числовой, текстовый, логический и т. Д.
Присоединения также будут возможны с помощью jsonb
Добавьте PLv8 для хранимых процедур, и для разработчиков node.js это станет мечтой.
Будучи сохраненным как двоичный файл, jsonb также удалит все пробелы, изменит порядок свойств и удалит повторяющиеся свойства, используя последний вхождение свойства.
Помимо индекса при запросе к столбцу jsonb, сопоставленному со столбцом json, postgres не обязательно должен запускать функцию преобразования текста в json в каждой строке, что, вероятно, сэкономит огромное количество времени в одиночку.
источник
Что касается различий между
json
иjsonb
Datatypes, то стоит упоминания официального объяснения:Источник: https://www.postgresql.org/docs/current/datatype-json.html
источник
Другое важное отличие, которое не упоминалось ни в одном ответе выше, заключается в том, что для
json
типа нет оператора равенства , но есть оператор дляjsonb
.Это означает , что вы не можете использовать
DISTINCT
ключевое слово при выборе этогоjson
-type и / или других полей из таблицы (вы можете использоватьDISTINCT ON
вместо этого, но это не всегда возможно из - за подобные случаи это ).источник
Насколько я могу сказать,
hstore в том виде, в каком он существует в настоящее время (в Postgresql 9.3), не допускает вложение других объектов и массивов в качестве значений его пар ключ / значение. тем не менее, будущий патч hstore позволит использовать вложенность. этот патч не будет выпущен в версии 9.4 и может быть не включен в ближайшее время.
json в том виде, в каком он существует в настоящее время , допускает вложение, но основывается на тексте и не допускает индексацию, поэтому он «медленный»
jsonb, который будет выпущен с 9.4, будет иметь текущие возможности вложения json, а также индексирование hstore в GIN / GIST, так что это будет быстро
Люди, работающие над 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
источник