Что я могу сделать с новым полем JSON?

8

PostgreSQL 9.2 представил jsonтип поля. Почему и когда я должен использовать это? Какие преимущества он имеет по сравнению с текстовым полем?

Я думал, что были доступны новые варианты запросов, однако я не видел ни одного. Я что-то пропустил?

Джонатан Эгертон
источник

Ответы:

7

Postgres 9.2

Преимущество новой функции в два раза. Столбцы типаjson проверяют правильность его содержимого, поэтому в столбце автоматически указывается JSON, и вы получаете сообщение об ошибке, если пытаетесь записать в него что-то еще.
И у вас есть базовые функции для создания действительного JSON на лету из строк или массивов - что является очень распространенным вариантом использования.

Я цитирую Эндрю Данстана в списке pgsql-хакеров :

На каком-то этапе, возможно, будут некоторые функции обработки json (в отличие от создания json), но не в 9.2.

Я использовал эту цитату раньше под этим вопросом на SO .

Postgres 9,3

.. наконец, приносит ряд функций и операторов. Проверьте страницу руководства для функций JSON .

Соответствующий ответ на SO:

@ Подниму пост в блоге. Смотрите комментарий ниже.

Postgres 9,4

Не забудьте проверить новый jsonbтип с множеством новых функций.

Прежде всего, разлагается, двоичное хранение позволяет меньшее хранение на диск и оператор равенства для jsonb( в отличие от json), что делает ряд дополнительных операций (например , возможный DISTINCTили UNIQUEиндекс).

Еще больше функций было добавлено для обоих jsonи jsonb. json_to_record()и json_to_recordset()т.д. Подробнее в заметках о выпуске.

Эрвин Брандштеттер
источник
1
Также вы можете использовать pl / v8js для манипулирования ими, что дает вам довольно удивительные возможности.
Крис Треверс
1
Да, но если вы используете размещенный экземпляр Postgres (например, Heroku), PLV8, вероятно, не вариант (конечно, не на Heroku). В этом случае, как я вижу, тип данных JSON имеет довольно ограниченную ценность в 9.2. Похоже, 9.3 может иметь хорошую поддержку.
Дэвид С
1
Посмотрите на обновления, поступающие в 9.3 michael.otacoo.com/postgresql-2/…
Уилл
2

В двух словах, тип данных JSON (а также более старые расширение и тип HSTORE) позволяют использовать PostgreSQL в качестве хранилища данных «без схемы» (или объединять реляционные и нереляционные данные «без схемы») вместо необходимость прибегать к некоторым другим параметрам NoSQL (например, MongoDB). Вы даже получаете некоторые вещи, которые вы не можете сделать с MongoDB, такие как фильтруемая индексация, индексация выражений и т. Д. Единственным недостатком является то, что PostgreSQL не поддерживает разделение из коробки, как MongoDB ... однако я на самом деле вопрос, как часто шардинг действительно необходим. С хорошо сконфигурированной базой данных PostgreSQL 9.3, достаточными ресурсами O / S и некоторыми достаточно хорошо продуманными отфильтрованными индексами выражений вы легко сможете получить поиск строк без схемы в диапазоне 0,25 миллисекунды.

HTH, Дейв Сиск

Дейв Сиск
источник
1

В основном я вижу три варианта использования здесь:

  1. легко передавать сложные результаты обратно в приложение
  2. передать сложные данные в базу данных из приложения, и
  3. Храните данные в свободной форме для последующей обработки.

Первый может быть сделан непосредственно из PostgreSQL без необходимости в надстройках. Вы должны быть в состоянии сделать что-то вроде:

SELECT row_to_json(mt.id, mt.testval, array_agg(mt2))
  FROM my_table mt
  JOIN my_table2 mt2 ON mt.id = mt2.mt_id
 WHERE mt.id = 123;

Затем его можно использовать для создания вложенных массивов и т. Д. В выходных данных и избежать множества проблем с синтаксическим анализом на стороне приложения.

вторая передает сложные данные в БД для обработки. В настоящее время нет встроенных функций, облегчающих это, но с такими дополнениями, как pl / v8js, вы можете программировать свою базу данных на Javascript и использовать json в качестве формата обмена. Это может позволить создание более богатых интерфейсов внутри вашей базы данных. Обратите внимание, что, поскольку вы можете индексировать выходные данные функции, вы можете использовать это для создания индексов аспектов JSON, которые будут храниться в вашей базе данных.

Третья - это область, в которой мы планируем использовать ее в LedgerSMB. Идея заключается в том, что мы можем позволить системным интеграторам хранить очень простую информацию вместе с учетными записями клиентов. Затем он может быть упакован в поле JSON, которое будет сохранено. Это не сможет быть напрямую запрошено основными приложениями, но если люди захотят добавить это с помощью pl / v8js, это может быть сделано для отдельных предприятий, использующих программное обеспечение.

Крис Траверс
источник