PostgreSQL vient d'introduire JSONB et il fait déjà partie des nouvelles des hackers . Ce serait formidable si quelqu'un pouvait expliquer en quoi il diffère de Hstore et JSON précédemment présents dans PostgreSQL. Quels sont ses avantages et ses limites et quand devrait-on envisager de l'utiliser?
json
postgresql
nosql
postgresql-json
jsonb
Peeyush
la source
la source
Réponses:
Tout d'abord,
hstore
est un module contrib, qui vous permet uniquement de stocker des paires clé => valeur, où les clés et les valeurs ne peuvent être quetext
s (mais les valeurs peuvent également être des sqlNULL
).Les deux
json
&jsonb
vous permettent de stocker une valeur JSON valide (définie dans ses spécifications ).F.ex. ceux - ci sont des représentations JSON valides:
null
,true
,[1,false,"string",{"foo":"bar"}]
,{"foo":"bar","baz":[null]}
-hstore
est juste un peu sous - ensemble par rapport à ce que JSON est capable (mais si vous avez seulement besoin ce sous - ensemble, il va bien).La seule différence entre
json
&jsonb
est leur stockage:json
est stocké dans son format de texte brut, tandis quejsonb
est stocké dans une représentation binaireIl y a 3 conséquences majeures à cela:
jsonb
prend généralement plus d'espace disque pour stocker quejson
(parfois non)jsonb
prend plus de temps à construire à partir de sa représentation d'entrée quejson
json
les opérations prennent beaucoup plus de tempsjsonb
(et l'analyse doit également être effectuée chaque fois que vous effectuez une opération avec unejson
valeur tapée)Lorsque
jsonb
sera disponible avec une version stable, il y aura deux cas d'utilisation majeurs, lorsque vous pourrez facilement choisir entre eux:json
.jsonb
.la source
jsonb
ne prend pas en charge cela?UPDATE test SET data->'a' = 123 WHERE id = 1;
deCREATE TABLE test(id SERIAL PRIMARY KEY, data JSONB);
json
plusjsonb
est si pour des raisons historiques votre code consumait votrejson
dépend de l'ordre desjson
champs et ils ne peuvent être réorganisées.text
vsjson
: ce dernier est livré avec une validation JSON, donc en cas de JSON invalide, il échouera uniquement lors de l'insertion, au lieu de chaque fois que votre application le lira (car il obtient une représentation non valide). De plus, vous pouvez caster ces derniers en toute sécuritéjsonb
dans la base de données.Peeyush:
La réponse courte est:
Pour une réponse plus longue, vous devrez attendre que je rédige un "HowTo" complet plus proche de la version 9.4.
la source
Une explication simple de la différence entre json et jsonb ( image originale par PostgresProfessional ):
Plus d'informations sur les discours vidéo et les diaporamas présentés par les développeurs de jsonb. Ils ont également introduit JsQuery , pg.extension fournit un puissant langage de requête jsonb
la source
hstore
est plus un type de stockage "large colonne", c'est un dictionnaire plat (non imbriqué) de paires clé-valeur, toujours stocké dans un format binaire raisonnablement efficace (une table de hachage, d'où le nom).json
stocke les documents JSON sous forme de texte, en effectuant une validation lorsque les documents sont stockés et en les analysant sur la sortie si nécessaire (c'est-à-dire en accédant à des champs individuels); il devrait prendre en charge l'intégralité de la spécification JSON. Étant donné que l'intégralité du texte JSON est stockée, sa mise en forme est préservée.jsonb
prend des raccourcis pour des raisons de performances: les données JSON sont analysées en entrée et stockées au format binaire, les ordres de touches dans les dictionnaires ne sont pas conservés, et les clés en double non plus. L'accès aux éléments individuels dans le champ JSONB est rapide car il ne nécessite pas d'analyser le texte JSON tout le temps. En sortie, les données JSON sont reconstruites et le formatage initial est perdu.OMI, il n'y a aucune raison importante de ne pas l' utiliser
jsonb
une fois qu'il est disponible, si vous travaillez avec des données lisibles par machine.la source
JSONB est une "meilleure" version de JSON.
Regardons un exemple:
En général, on devrait préférer JSONB, sauf s'il existe des besoins spécialisés, tels que des hypothèses héritées sur l'ordre des clés d'objet.
la source
J'étais au pgopen aujourd'hui, les benchmarks sont bien plus rapides que mongodb, je crois que c'était environ 500% plus rapide pour les selects. À peu près tout était plus rapide d'au moins 200% par rapport à mongodb, à l'exception d'une seule mise à jour qui nécessite de réécrire complètement la colonne json entière, ce que mongodb gère mieux.
L'indexation de gin sur jsonb semble incroyable.
Postgres conservera également les types de jsonb en interne et les associera essentiellement à des types tels que numérique, texte, booléen, etc.
Les jointures seront également possibles en utilisant jsonb
Ajoutez PLv8 pour les procédures stockées et ce sera essentiellement un rêve devenu réalité pour les développeurs de node.js.
Le fait qu'il soit stocké en tant que jsonb binaire supprimera également tous les espaces, modifiera l'ordre des propriétés et supprimera les propriétés en double en utilisant la dernière occurrence de la propriété.
En plus de l'index lors d'une requête sur une colonne jsonb contrairement à une colonne json, postgres n'a pas à exécuter la fonctionnalité pour convertir le texte en json sur chaque ligne, ce qui économisera probablement beaucoup de temps seul.
la source
En ce qui concerne les différences entre les types de données
json
etjsonb
, il convient de mentionner l'explication officielle:Source: https://www.postgresql.org/docs/current/datatype-json.html
la source
Une autre différence importante, qui n'a été mentionnée dans aucune réponse ci-dessus, est qu'il n'y a pas d'opérateur d'égalité pour le
json
type, mais il y en a un pourjsonb
.Cela signifie que vous ne pouvez pas utiliser de
DISTINCT
mot-clé lors de la sélection de cejson
type et / ou d'autres champs d'une table (vous pouvez utiliser à laDISTINCT ON
place, mais ce n'est pas toujours possible à cause de cas comme celui-ci ).la source
Autant que je sache,
hstore tel qu'il existe actuellement (dans Postgresql 9.3) ne permet pas d'imbriquer d'autres objets et tableaux en tant que valeurs de ses paires clé / valeur. cependant, un futur patch hstore permettra l'imbrication. ce correctif ne sera pas dans la version 9.4 et pourrait ne pas être inclus de sitôt.
JSON tel qu'il existe actuellement ne permet pour la nidification, mais est basé sur le texte, et ne permet pas d'indexation, il est donc « lent »
jsonb qui sera publié avec 9.4 aura les capacités d'imbrication actuelles de json, ainsi que l'indexation GIN / GIST de hstore, donc ce sera rapide
Les personnes travaillant sur postgresql 9.4 semblent dire que le nouveau type jsonb rapide plaira aux personnes qui auraient choisi d'utiliser un magasin de données noSQL comme MongoDB, mais peuvent désormais combiner une base de données relationnelle avec des données non structurées interrogeables sous un même toit
http://www.databasesoup.com/2014/02/why-hstore2jsonb-is-most-important.html
Les repères de postgresql 9.4 jsonb semblent être comparables ou dans certains cas plus rapides que MongoDB
http://texture.io/alphabetum/postgresql-incl-hstore-vs-mongodb
la source