Explication de JSONB introduit par PostgreSQL
PostgreSQL vient de présenter JSONB et c'est déjà une tendance sur hacker news. Ce serait génial si quelqu'un pouvait expliquer comment il est différent de Hstore et JSON déjà présents dans PostgreSQL. Quels sont ses avantages et ses limites et quand doit-on envisager de l'utiliser?
- De PGCon2014: youtube.com/...
- l'url n'est pas assez précise, maintenant, 1 an plus tard, il n'a même pas de point d'assez près pour JSONB liées au contenu.
- J'ai pensé que j'ai relié à la poste. Comment frustrant.
- Il n'est point de la vidéo.
Vous devez vous connecter pour publier un commentaire.
D'abord,
hstore
est un module contrib, qui permet uniquement de stocker la clé => valeur de paires de clés et de valeurs ne peut êtretext
s (les valeurs peuvent être sqlNULL
s trop).Les deux
json
&jsonb
vous permet de stocker une JSON valide valeur (défini dans son spec).F. ex. ce sont JSON valide représentations:
null
,true
,[1,false,"string",{"foo":"bar"}]
,{"foo":"bar","baz":[null]}
-hstore
est juste un petit sous-ensemble par rapport à ce que JSON est capable (mais si vous avez uniquement besoin de ce sous-ensemble, c'est très bien).La seule différence entre
json
&jsonb
est leur capacité de stockage:json
est stocké dans son format de texte brut, tandis quejsonb
est stockée dans certains représentation binaireIl y a 3 principales conséquences de cette:
jsonb
prend généralement plus d'espace disque pour stocker dejson
(parfois pas)jsonb
prend plus de temps pour construire à partir de son entrée à la représentation quejson
json
opérations significativement plus de temps quejsonb
(& l'analyse doit également être effectuée à chaque fois que vous effectuez une opération à unjson
valeur typée)Quand
jsonb
sera disponible avec une version stable, il y aura deux grands cas d'utilisation, lorsque vous pouvez facilement sélectionner entre eux:json
.jsonb
.jsonb
ne supporte pas cette?UPDATE test SET data->'a' = 123 WHERE id = 1;
deCREATE TABLE test(id SERIAL PRIMARY KEY, data JSONB);
json
surjsonb
est si pour des raisons d'héritage de votre code de consommer votrejson
dépend de la commande de lajson
champs et ils ne peuvent pas être réorganisées.text
vsjson
: ce dernier est livré avec JSON validation, donc sur invalid JSON, il échoue seulement lors de l'insertion, au lieu de chaque fois que votre application lit (car il obtient une défaillance de la représentation). Aussi, vous pouvez en toute sécurité cast le dernier àjsonb
dans la base de données.Peeyush:
La réponse courte est:
Pour apporter une réponse plus longue, vous aurez besoin d'attendre pour moi de faire un "HowTo" writeup plus proche de la version 9.4.
Une simple explication de la différence entre json et jsonb (image d'origine par PostgresProfessional):
Plus en discours vidéo et diaporama de présentation par jsonb développeurs. Aussi, ils ont introduit le JsQuery, pg.l'extension fournit de puissants jsonb langage de requête
hstore
est plus un "à l'échelle de la colonne" type de stockage, c'est un plat (non imbriquée) dictionnaire de paires clé-valeur, toujours stockée dans un raisonnablement efficace format binaire (une table de hachage, d'où le nom).json
magasins JSON documents en tant que texte, en effectuant la validation lorsque les documents sont stockés, et l'analyse sur la sortie si nécessaire (à savoir l'accès à des champs individuels); elle doit prendre en charge l'ensemble de la spécification JSON. Depuis l'ensemble du JSON texte est stocké, sa mise en forme est conservée.jsonb
prend des raccourcis pour des raisons de performances: les données JSON est analysée sur l'entrée et stockées dans un format binaire, clé de rangements dans les dictionnaires ne sont pas entretenus, et ne sont ni des doubles des clés. D'accéder à différents éléments dans le JSONB champ est rapide car elle ne nécessite pas de parser le JSON texte tout le temps. Sur la production, les données JSON est reconstruite et la mise en forme initiale est perdue.De l'OMI, il n'y a pas de raison majeure pour pas à l'aide de
jsonb
une fois qu'il est disponible, si vous travaillez avec des données lisibles par machine.J'étais à la pgopen aujourd'hui, les repères sont plus rapides que mongodb, je crois que c'était autour de 500% plus rapide pour les sélections. À peu près tout a été plus rapide au moins à 200% lorsqu'ils sont en contraste avec mongodb, qu'une exception, c'est maintenant une mise à jour qui nécessite la réécriture complète de l'ensemble du json colonne de quelque chose de mongodb gère mieux.
Le gin indexation sur jsonb semble incroyable.
Aussi postgres persisteront types de jsonb en interne et en gros ce match avec des types comme numérique, texte, booléen, etc.
Jointures sera également possible à l'aide de jsonb
Ajouter PLv8 pour les procédures stockées et ce sera essentiellement un rêve devenu réalité pour node.js des développeurs.
C'est d'être stockées sous forme binaire jsonb allons également supprimer tous les espaces, modifier l'ordre des propriétés et de supprimer les doublons en utilisant les propriétés de la dernière occurrence de la propriété.
En plus de l'index lors de l'interrogation d'un jsonb colonne opposition à un json colonne postgres n'ont pas à exécuter la fonctionnalité de convertir le texte en json sur chaque ligne qui risquent d'enregistrer une grande quantité de temps seul.
JSONB est une "meilleure" version de JSON.
Prenons un exemple:
En général, on préfère JSONB , sauf s'il y a des besoins spéciaux, tels que l'héritage des suppositions sur la commande de clés de l'objet.
Aussi loin que je peux dire,
hstore telle qu'elle existe actuellement (dans Postgresql 9.3) ne permet pas de nidification d'autres objets et les tableaux que les valeurs de ses paires clé/valeur. toutefois, un avenir hstore patch va permettre pour la nidification. ce patch ne sera pas dans la version 9.4 et peuvent ne pas être inclus tout moment bientôt.
json comme il existe actuellement ne permettre la nidification, mais est basé sur du texte, et ne permettent pas pour l'indexation, donc il est "lent"
jsonb qui sera publié avec 9.4 de l'actuel de nidification des capacités de json, ainsi que le GIN/GIST indexation de hstore, de sorte qu'il sera rapide
Les personnes travaillant sur postgresql 9.4 semblent dire que la nouvelle, rapide jsonb type fera appel à des gens qui ont choisi d'utiliser une banque de données noSQL comme MongoDB, mais peut maintenant combiner une base de données relationnelle à l'aide de requêtes-mesure des données non structurées sous un même toit
http://www.databasesoup.com/2014/02/why-hstore2jsonb-is-most-important.html
Repères de postgresql 9.4 jsonb semblent être au même niveau ou dans certains cas plus rapide que MongoDB
http://texture.io/alphabetum/postgresql-incl-hstore-vs-mongodb
Une autre différence importante, qui n'était pas mentionné dans la réponse ci-dessus, est qu'il n'y a pas d'opérateur d'égalité pour
json
type, mais il y en a pourjsonb
.Cela signifie que vous ne pouvez pas utiliser
DISTINCT
mot-clé lors de la sélection de cettejson
-type et/ou dans d'autres champs d'une table (vous pouvez utiliserDISTINCT ON
à la place, mais il n'est pas toujours possible en raison de cas comme cette).