web-dev-qa-db-fra.com

Différence entre JSON et JSONB à Postgres

Quelle est la différence entre le type de données JSON et JSONB dans PosgresSQL?

  1. Quand faut-il en utiliser un spécifique?
  2. Quels sont les avantages ou les inconvénients par rapport aux autres?
18
Somnath Muluk

Ceci est expliqué: https://www.citusdata.com/blog/2016/07/14/choosing-nosql-hstore-json-jsonb/

Dans la plupart des cas, JSONB est probablement ce que vous voulez lorsque vous recherchez un type de données NoSQL, sans schéma. Hstore et JSON peuvent également avoir leur place mais c'est moins courant. Plus largement, JSONB n'est pas toujours adapté à tous les modèles de données. Là où vous pouvez normaliser, il y a des avantages, mais si vous avez un schéma qui a un grand nombre de colonnes facultatives (comme avec les données d'événement) ou si le schéma diffère en fonction de l'ID du locataire, JSONB peut être un excellent choix. En général, vous voulez:

JSONB - In most cases
JSON - If you’re just processing logs, don’t often need to query, and use as more of an audit trail
hstore - Can work fine for text based key-value looks, but in general JSONB can still work great here
12
Piotr R

json est fondamentalement un blob qui stocke des données JSON au format brut, préservant même des éléments insignifiants tels que les espaces, l'ordre des clés dans les objets, ou même les clés en double dans les objets. Il offre la possibilité d'effectuer certaines opérations JSON de base telles que l'extraction de la valeur associée à une clé dans un objet, bien qu'il soit lent à cela car il doit analyser le blob JSON à chaque fois. Il valide également chaque valeur pour vérifier qu'il s'agit d'un JSON valide. jsonb d'autre part stocke les données JSON dans un format personnalisé qui est optimisé pour certaines opérations telles que l'extraction de la valeur associée à une clé dans un objet (c'est-à-dire qu'il ne ré-analysera pas JSON, il ne recherchera pas de manière linéaire). De plus, jsonb prend en charge plus d'opérations, tout comme la concaténation d'objets ou la définition d'une valeur profondément à l'intérieur d'un objet.

En général, j'utilise json uniquement si je sais que je ne ferai aucune opération JSON ou que je ne les ferai qu'occasionnellement. Pour tous les autres cas, j'utilise jsonb. Notez que pour le premier cas, text c'est aussi une option parfaitement valide, surtout si vous n'êtes pas intéressé par la validation que json fait (par exemple parce que vous faites confiance à la source des données).

29
redneb