Explication de JSONB introduit par PostgreSQL

PostgreSQL vient juste d’introduire JSONB et sa tendance est déjà aux nouvelles des pirates . Ce serait génial si quelqu’un pouvait expliquer comment il est différent de Hstore et JSON précédemment présent dans PostgreSQL. Quels sont ses avantages et ses limites et quand doit-on envisager de l’utiliser?

    Tout d’abord, hstore est un module consortingb, qui vous permet uniquement de stocker des paires clé => valeur, où les clés et les valeurs ne peuvent être que du text s (cependant, les valeurs peuvent également être sql NULL s).

    jsonb & jsonb vous permettent de stocker une valeur JSON valide (définie dans sa spécification ).

    F.ex. ce sont des représentations JSON valides: null , true , [1,false,"ssortingng",{"foo":"bar"}] , {"foo":"bar","baz":[null]}hstore est juste un petit sous-ensemble comparé à ce que JSON est capable (mais si vous n’avez besoin que de ce sous-ensemble, c’est bien).

    La seule différence entre json et jsonb est leur stockage:

    • json est stocké dans son format texte brut, alors que
    • jsonb est stocké dans une représentation binary

    Il y a 3 conséquences majeures de ceci:

    • jsonb prend généralement plus d’espace disque que json (parfois pas)
    • jsonb prend plus de temps pour construire à partir de sa représentation en entrée que json
    • json opérations json prennent beaucoup plus de temps que jsonb (et l’parsing doit également être effectuée chaque fois que vous effectuez une opération avec une valeur typée json )

    Lorsque jsonb sera disponible avec une version stable, il y aura deux cas d’utilisation majeurs, lorsque vous pourrez facilement les sélectionner:

    1. Si vous ne travaillez qu’avec la représentation JSON dans votre application, PostgreSQL est uniquement utilisé pour stocker et récupérer cette représentation, vous devez donc utiliser json .
    2. Si vous faites beaucoup d’opérations sur la valeur JSON dans PostgreSQL, ou utilisez l’indexation sur un champ JSON, vous devez utiliser jsonb .

    Peeyush:

    La réponse courte est:

    • Si vous faites beaucoup de manipulation JSON dans PostgreSQL, comme le sorting, le découpage, l’épissage, etc., vous devez utiliser JSONB pour des raisons de rapidité.
    • Si vous avez besoin de recherches indexées pour des recherches de clés arbitraires sur JSON, vous devez utiliser JSONB.
    • Si vous ne faites ni l’un ni l’autre de ces éléments, vous devriez probablement utiliser JSON.
    • Si vous devez conserver le classement des clés, les espaces et les clés en double, vous devez utiliser JSON.

    Pour une réponse plus longue, vous devrez attendre que je fasse un texte complet “HowTo” plus proche de la version 9.4.

    Une explication simple de la différence entre json et jsonb ( image originale par PostgresProfessional ):

     SELECT '{"c":0, "a":2,"a":1}'::json, '{"c":0, "a":2,"a":1}'::jsonb; json | jsonb ------------------------+--------------------- {"c":0, "a":2,"a":1} | {"a": 1, "c": 0} (1 row) 
    • json: stockage textuel «tel quel»
    • jsonb: pas d’espaces blancs
    • jsonb: pas de clés en double, dernière clé gagnante
    • jsonb: les clés sont sortingées

    Plus dans la vidéo de discours et la présentation de diaporama par les développeurs jsonb. Ils ont également introduit JsQuery , pg.extension fournit un puissant langage de requête jsonb

    • hstore est plutôt un type de stockage “à colonnes larges”, c’est un dictionnaire plat (non nested) de paires clé-valeur, toujours stocké dans un format binary raisonnablement efficace (une table de hachage, d’où son nom).
    • json stocke les documents JSON sous forme de texte, en effectuant une validation lorsque les documents sont stockés et en les analysant en sortie si nécessaire (c.-à-d. en accédant à des champs individuels); il devrait supporter toute la spécification JSON. Le texte JSON entier étant stocké, 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 binary, les classements de clés dans les dictionnaires ne sont pas conservés et les clés en double ne sont pas conservées. L’access à des éléments individuels dans le champ JSONB est rapide car il ne nécessite pas d’parsingr le texte JSON en permanence. En sortie, les données JSON sont reconstruites et le formatage initial est perdu.

    IMO, il n’y a pas de raison significative de ne pas utiliser jsonb une fois disponible, si vous travaillez avec des données lisibles par machine.

    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 sélections. A peu près tout était plus rapide au moins de 200% par rapport à mongodb, mais une seule exception est une mise à jour qui nécessite de réécrire complètement la colonne json entière quelque chose que mongodb gère mieux.

    Le gin indexing on jsonb est génial.

    De plus, postgres va persister en interne les types de jsonb et les comparer à 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.

    En étant stocké en tant que binary, jsonb supprime également tous les espaces, modifie l’ordre des propriétés et supprime les propriétés en double en utilisant la dernière occurrence de la propriété.

    Outre l’index lors de l’interrogation sur une colonne jsonb contrastée par rapport à une colonne json, postgres n’a pas besoin d’exécuter la fonctionnalité pour convertir le texte en json sur chaque ligne, ce qui économisera probablement beaucoup de temps.

    Pour autant que je sache,

    • hstore, tel qu’il existe actuellement (dans Postgresql 9.3), ne permet pas d’imbriquer d’autres objects et tableaux comme 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 ne sera peut-être pas inclus dans le temps.

    • json, tel qu’il existe actuellement, permet l’imbrication, mais est basé sur du texte, et ne permet pas l’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 il sera rapide

    Les personnes travaillant sur postgresql 9.4 semblent dire que le nouveau type jsonb rapide attirera les personnes qui auraient choisi d’utiliser un magasin de données noSQL comme MongoDB, mais peut désormais combiner une firebase database relationnelle avec des données non structurées pouvant être interrogées sous un même toit

    http://www.databasesoup.com/2014/02/why-hstore2jsonb-is-most-important.html

    Les tests de performance de postgresql 9.4 jsonb semblent être identiques ou, dans certains cas, plus rapides que MongoDB

    http://texture.io/alphabetum/postgresql-incl-hstore-vs-mongodb

    jsonb est “meilleure” version de JSON. Permet de vérifier à l’aide d’un exemple.

    Comparaison par Prosfessional Postgres

    1. JSON autorise les espaces blancs, c’est pourquoi nous pouvons voir des espaces lorsque la clé “a” est stockée, alors que JSONB ne le fait pas.
    2. JSON stocke toutes les valeurs de clé. C’est la raison pour laquelle vous pouvez voir plusieurs valeurs (2 et 1) contre la clé “a”, tandis que JSONB ne “stocke” que la dernière valeur.
    3. JSON conserve l’ordre dans lequel les éléments sont insérés, tandis que JSONB conserve l’ordre “sortingé”.
    4. Les objects JSONB sont stockés en tant que fichiers binarys décompressés, contrairement aux “données brutes” dans JSON, où aucune parsing des données n’est requirejse lors de la récupération.
    5. jsonb supporte également l’indexation, ce qui peut être un avantage significatif.

    En général, on devrait préférer JSONB, à moins qu’il y ait des besoins très spécialisés, tels que des suppositions héritées sur l’ordre des clés d’object.

    Une autre différence importante, qui n’a été mentionnée dans aucune réponse ci-dessus, est qu’il n’ya pas d’opérateur d’égalité pour le type json , mais il y en a un pour jsonb .

    Cela signifie que vous ne pouvez pas utiliser le DISTINCT clé DISTINCT lors de la sélection de ce type json et / ou d’autres champs dans une table (vous pouvez utiliser DISTINCT ON place, mais ce n’est pas toujours possible à cause de ces cas).