Que puis-je faire avec le nouveau champ json?

8

PostgreSQL 9.2 a introduit le jsontype de champ. Pourquoi et quand devrais-je l'utiliser? Quels sont ses avantages sur un champ de texte?

Je pensais que de nouvelles options de requête étaient disponibles, mais je n'en ai pas vu. Suis-je en train de manquer quelque chose?

Jonathan Egerton
la source

Réponses:

7

Postgres 9.2

L'avantage de la nouvelle fonctionnalité est double. Les colonnes de typejson vérifient la validité de son contenu afin que le contenu de la colonne soit automatiquement JSON valide et vous obtenez une erreur si vous essayez d'écrire autre chose dessus.
Et vous avez des fonctions de base pour créer un JSON valide à la volée à partir de lignes ou de tableaux - ce qui est un cas d'utilisation très courant.

Je cite Andrew Dunstan sur la liste pgsql-hackers :

À un certain stade, il y aura peut-être des fonctions de traitement json (par opposition à la production json), mais pas en 9.2.

J'ai utilisé cette citation avant sous cette question connexe sur SO .

Postgres 9.3

.. apporte enfin un certain nombre de fonctions et d'opérateurs. Consultez la page de manuel pour les fonctions JSON .

Réponse connexe sur SO:

@ Mettra en place un article de blog. Voir commentaire ci-dessous.

Postgres 9.4

Assurez-vous de vérifier le nouveau jsonbtype avec une multitude de nouvelles fonctionnalités.

Surtout, le stockage binaire décomposé permet un stockage plus petit sur le disque et un opérateur d'égalité pour jsonb(contrairement json), ce qui rend possible un certain nombre d'opérations supplémentaires (comme DISTINCTou un UNIQUEindex).

Pourtant, plus de fonctions ont été ajoutées pour jsonet jsonb. json_to_record(), json_to_recordset()etc. Plus dans les notes de version.

Erwin Brandstetter
la source
1
Vous pouvez également utiliser pl / v8js pour les manipuler, ce qui vous donne des capacités assez impressionnantes.
Chris Travers
1
Oui, mais si vous utilisez une instance Postgres hébergée (comme Heroku), PLV8 n'est probablement pas une option (certainement pas sur Heroku). Dans ce cas, d'après ce que je peux voir, le type de données JSON a une valeur assez limitée en 9.2. Il semble que 9.3 puisse avoir un bon support.
David S
1
Un regard sur les mises à jour à venir en 9.3 michael.otacoo.com/postgresql-2/…
Will
2

En résumé, le type de données JSON (ainsi que l'extension et le type de données HSTORE plus anciens) vous permettent d'utiliser PostgreSQL comme un magasin de données "sans schéma" (ou de combiner des données relationnelles et non relationnelles "sans schéma"), au lieu de avoir à recourir à certaines des autres options NoSQL (comme MongoDB). Vous gagnez même des choses que vous ne pouvez pas faire avec MongoDB, comme l'indexation filtrée, l'indexation des expressions, etc. Le seul inconvénient est que PostgreSQL ne prend pas en charge le partitionnement prêt à l'emploi comme le fait MongoDB ... cependant, je se demandent vraiment à quelle fréquence le partage est vraiment nécessaire. Avec une base de données PostgreSQL 9.3 bien configurée, des ressources O / S suffisantes et des index d'expressions filtrées raisonnablement bien pensés, vous devriez facilement être en mesure de récupérer des lignes sans schéma dans la plage de 0,25 milliseconde.

HTH, Dave Sisk

Dave Sisk
la source
1

Fondamentalement, je vois trois cas d'utilisation ici:

  1. transmettre facilement des résultats complexes à l'application
  2. transmettre des données complexes dans la base de données à partir de l'application, et
  3. Stockez des données sous forme relativement libre pour un traitement ultérieur.

Le premier peut être fait directement à partir de PostgreSQL sans aucun addon nécessaire. Vous devriez pouvoir faire quelque chose comme:

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;

Cela peut ensuite être utilisé pour créer des tableaux imbriqués, etc. dans votre sortie et éviter beaucoup de problèmes d'analyse désordonnés du côté de l'application.

le second passe des données complexes dans la base de données pour traitement. Actuellement, il n'y a pas de fonctions intégrées pour faciliter cela, mais avec des addons comme pl / v8js, vous pouvez programmer votre base de données en Javascript et utiliser json comme format d'échange. Cela peut permettre la création d'interfaces plus riches dans votre base de données. Notez que puisque vous pouvez indexer des sorties de fonction, vous pouvez l'utiliser pour créer des index d'aspects de JSON à stocker dans votre base de données.

Le troisième est un domaine que nous prévoyons de l'utiliser dans LedgerSMB. L'idée est que nous pourrions vouloir permettre aux intégrateurs de systèmes de stocker des informations très simples avec les comptes clients. Cela pourrait ensuite être emballé dans un champ JSON qui serait stocké. Cela ne pourrait pas être directement interrogé par les applications principales, mais si les gens voulaient l'ajouter à l'aide de pl / v8js, cela pourrait être fait pour les entreprises individuelles utilisant le logiciel.

Chris Travers
la source