PostgreSQL pour gérer JSON

PostgreSQL pour gérer JSON
L'un des nombreux types de données que le support postgresql est JSON. Étant donné que la plupart des API Web Communication utilisent énormément la charge utile JSON, cette fonctionnalité est assez importante. Plutôt que d'utiliser le type de données en clair pour stocker des objets JSON, Postgres a un type de données différent qui est optimisé pour les charges utiles JSON, vérifie que les données stockées dans ces champs confirment à la spécification RFC. Également de la manière classique de Postgres, il vous permet de réprimer vos champs JSON pour des performances maximales.

Lors de la création d'une table, vous aurez deux options pour votre colonne JSON. Le type de données JSON PLAIN et le type de données JSONB, les deux ont leurs propres avantages et inconvénients. Nous passerons chacun d'eux, en créant une table simple avec seulement 2 colonnes un identifiant et une valeur JSON. Après cela, nous interrogerons les données du tableau et aurons une idée de la façon de gérer les données formatées JSON à l'intérieur de Postgres.

Type de données JSON

Création d'une table avec type de données JSON

Créons une table de deux colonnes simple nommée utilisateurs:

Créer des utilisateurs de table (
id série non null clé primaire,
info json pas null
));

Ici, l'ID de colonne agit comme la clé principale, et elle augmentera de manière incrémentielle grâce à la série pseudotype afin que nous n'aurions pas à nous soucier de saisir manuellement les valeurs pour ID au fur et à mesure.

La deuxième colonne est de type JSON et est forcée de ne pas être nul. Entrons quelques rangées de données à ce tableau, composé de valeurs JSON.

Insérer dans les valeurs des utilisateurs (info) (
'
"Nom": "Jane Doe",
"Courriel": "Janedoe @ Exemple.com ",
"PersonalDetails": "Age": 33, "Gender": "F"
');
Insérer dans les valeurs des utilisateurs (info) (
'
"Nom": "Jane Doe",
"Courriel": "Janedoe @ Exemple.com ",
"PersonalDetails": "Age": 33, "Gender": "F"
');

Vous pouvez utiliser votre embellissement / minificateur JSON préféré pour convertir les charges utiles JSON ci-dessus en une seule ligne. Afin que vous puissiez le coller dans votre invite PSQL.

Sélectionner * chez les utilisateurs;
ID | Info
----+------------------------------------------------------
1 | "Name": "John Doe", "Email": "johndoe @ Exemple.com "…
2 | "Name": "Jane Doe", "Email": "Janedoe @ Exemple.com "…
(2 rangées)

La commande Select à la fin nous a montré que les lignes ont été insérées avec succès dans le tableau des utilisateurs.

Interroger le type de données JSON

Postgres vous permet de creuser dans la charge utile JSON elle-même et de récupérer une valeur particulière, si vous la référez en utilisant la valeur correspondante. Nous pouvons utiliser l'opérateur -> après le nom de la colonne JSON, suivi de la clé à l'intérieur de l'objet JSON. Ce faisant
Par exemple, dans le tableau que nous avons créé ci-dessus:

Sélectionnez Info -> 'Email' chez les utilisateurs;
----+----------------------------------------
ID | ?colonne?
----+----------------------------------------
1 | "JOHNDOE @ Exemple.com "
2 | "Janedoe @ Exemple.com "

Vous avez peut-être remarqué les doubles citations dans la colonne contenant des e-mails. En effet. Bien sûr, vous pouvez retourner juste du texte, mais vous devrez utiliser l'opérateur - >> à la place.

Sélectionnez des informations - >> 'e-mail' des utilisateurs;
ID | ?colonne?
----+----------------------------------------
1 | johndoe @ exemple.com
2 | Janedoe @ Exemple.com

La différence entre le retour d'un objet JSON et une chaîne devient claire une fois que nous commençons à travailler avec des objets JSON imbriqués à l'intérieur d'autres objets JSON. Par exemple, j'ai choisi la clé «PersonalDetails» pour tenir intentionnellement un autre objet JSON. Nous pouvons également creuser dans cet objet, si nous le voulons:

Sélectionnez Info -> 'PersonalDetails' -> 'Gender' des utilisateurs;
?colonne?
----------
"M"
"F"
(2 rangées)

Cela peut vous permettre d'aller aussi profondément dans l'objet JSON que vous voudriez. Déposez ce tableau et créons un nouveau (avec le même nom) mais avec le type JSONB.

Type de données JSONB

Sauf pour le fait que lors de la création du tableau, nous mentionnons le type de données JSONB au lieu de JSON, tout le reste regards le même.

Créer des utilisateurs de table (
id série non null clé primaire,
info jsonb pas null
));

Même l'insertion de données et de récupération en utilisant l'opérateur -> se comporte de la même manière. Ce qui a changé est tout sous le capot et notable dans la performance de la table. Lors de la conversion du texte JSON en JSONB, Postgres transforme en fait les différents types de valeur JSON en type Postgres natif, donc tous les objets JSON valides ne peuvent pas être enregistrés en tant que valeur JSONB valide.

De plus, JSONB ne conserve pas les espaces blancs, l'ordre des clés JSON tel qu'il est fourni par la déclaration d'insertion. JSONB convertit en fait la charge utile en binaire Postgres natif, d'où le terme jsonb.

Bien sûr, l'insertion de JSONB Datum a des frais généraux de performance en raison de tous ces travaux supplémentaires que Postgres doit faire. Cependant, l'avantage que vous gagnez est en termes de traitement plus rapide des données déjà stockées, car votre application n'aurait pas besoin d'analyser une charge utile JSON à chaque fois qu'elle récupère une de la base de données.

JSON VS JSONB

La décision entre JSON et JSONB Sole dépend de votre cas d'utilisation. En cas de doute, utilisez JSONB, car la plupart des applications ont tendance à avoir des opérations de lecture plus fréquentes qui écrivent des opérations. D'un autre côté, si vous êtes sûr que votre application devrait effectuer plus d'opérations d'écriture synchrones que la lecture, vous voudrez peut-être considérer JSON comme une alternative.

Conclusion

Les personnes travaillant avec des charges utiles JSON et la conception d'interfaces pour le stockage de Postgres bénéficieront énormément de cette section particulière de leur documentation officielle. Les développeurs ont eu la gentillesse de nous fournir une indexation JSONB et d'autres fonctionnalités intéressantes qui peuvent être exploitées pour améliorer les performances et la simplicité de votre application. Je vous implore également de les enquêter.
J'espère que vous avez trouvé cette brève introduction de la question utile et inspirante.