design Article

JSON dans PostgreSQL, une hérésie ?

JSON dans PostgreSQL, une hérésie ?

Eh oui, stocker des données au format JSON dans PostgreSQL c’est possible. À l’instar des base de données NoSQL comme MongoDB, PostgresSQL peut stocker des documents au format JSON. 

Mais pourquoi ? 

Eh bien, d’après-moi c’est parce que cela offre le meilleur des 2 mondes. Il arrive souvent que dans les applications modernes, le recours au stockage de document (clé / valeur) soit très pratique. Pour enregistrer des logs, des informations rapidement accessibles, de l’information brut et non relative … Les applications modernes ne requiert pas en tout temps des données relative.

Une autre raison qui me parait intéressante est que des fois, la fainéantise (ou le manque de temps) du développeur va faire que certaine données ne seront pas collectées et enregistrées en base données. Si la modélisation demande d’ajouter 7 tables et que le schéma de la base de données devient une usine à gaz, le développeur est humain, oui, et des fois ça ne le tente pas, il préfère aller se boire une bière. C’est alors que le type de données JSON intervient pour permettre de « jeter » un groupe de donnée au format JSON dans un champs. 

Il suffit de créer un champs de type JSON ou JSONB (nous verrons la différence plus tard) et vous avez accès au stockage de donnée hiérarchique que permet JSON. Mais ce n’est pas tout, sinon vous auriez pu mettre vos données au format JSON dans un champ de type « TEXT ». L’important avec le type de donnée JSON est que vous allez pouvoir faire des requêtes SQL directement dans le JSON. PostgreSQL propose des fonctions et des opérateurs spécifiques au format JSON pour faire vos requêtes, et cerise sur le gâteau, c’est très efficace et rapide.

JSON ou JSONB 

Lorsque vous souhaitez enregistrer des données au format JSON dans PostgreSQL, vous avez le choix en JSON et JSONB (JSON Binary). 

Les deux types de données JSON et JSONB dans Postgres sont utilisés pour stocker des données au format JSON, mais ils ont des comportements différents en ce qui concerne l’indexation et la vérification de la validité des données.

JSON est un type de données non indexable, ce qui signifie qu’il n’est pas possible d’utiliser des index pour accélérer les requêtes qui filtrent ou trient des données JSON. Il est également moins efficace pour stocker des données qui contiennent des erreurs de syntaxe ou des valeurs non valides.

JSONB est un type de données indexable, il permet d’utiliser des index pour accélérer les requêtes qui filtrent ou trient des données. Il est également plus efficace pour stocker des données qui contiennent des erreurs de syntaxe ou des valeurs non valides car il vérifie la validité des données au moment de l’insertion.

Requêtes SQL sur un champs JSON dans PostgreSQL

Pour cet article, nous allons nous concentrer sur les opérateurs, mais sachez qu’ils existent aussi plein de fonctions dont vous pouvez trouver la liste dans la documentation de PostgreSQL. Les opérateurs vous permettent de faire des requêtes SQL simple dans un champs JSON ou JSONB.

La flèche courte -> garde le type JSON

La flèche longue ->> retourne du texte.

Voici le code SQL pour reproduire ce petit tutoriel vous même : 

CREATE TABLE transaction (
id serial NOT NULL PRIMARY KEY,
message json NOT NULL
);
INSERT INTO transaction (message)
VALUES('{ "order_id": "7856", "items": {"product": "Beer","qty": 24}}'),
('{ "order_id": "9801", "items": {"product": "Pizza","qty": 1}}'),
('{ "order_id": "10089", "items": {"product": "Wine","qty": 2}}');

Voici un exemple de requête pour récupérer tous les order_id du champs « message » de la table « transaction ». Attention ça va aller vite :

SELECT message->'order_id' from transaction;

Plutôt simple, non ? ça nous retourne 3 ligne : « 7856 », « 9801 » et « 10089 »

Maintenant si je souhaite obtenir les items dont le order_id est 9801, voici la requête :

SELECT message->'items' as items from orders WHERE message ->> 'order_id' = '9801';

Aller plus loin sur JSON et JSONB dans Postgres

Voici une vidéo pour étendre le sujet du JSON & JSONB pour Postgres :

Conclusion

Vous voyez la puissance du couple JSON et SQL ? C’est super utile de pouvoir stocker des données non organisées dans un JSON et de pouvoir faire une requête SQL dans le JSON directement. C’est un gain de temps énorme et ça peut aussi améliorer votre application puisque le SQL va pouvoir pré-mâcher les données.

Si vous êtes intéressé à en savoir plus sur les champs de type JSON dans Postgres et comment travailler avec ceux-ci, à voir plus d’exemples … Laissez un commentaire et je pourrais faire un autre article plus en profondeur.

Envoyer des fichiers sur un Bucket Digital Ocean avec Forklift 3 sur Mac OS

Envoyer des fichiers sur un Bucket Digital Ocean avec Forklift 3 sur Mac OS

Si vous utilisez Digital Ocean comme plateforme de développement, peut-être payez-vous pour de l’espace de stockage autrement nommé Spaces ou Buckets. C’est on cas en tout cas 🙂 

Lorsque vous payez un « Spaces » chez Digital Ocean, vous payez 5$ / mois pour 200Go de stockage et pour ma part je n’utilise que 1 Go pour l’instant. Je me demandais donc comment rentabiliser cet espace. J’en suis venu au fait que envoyer des backup en serait un bon usage. Mais voilà, problème : dans l’interface de Digital Ocean, on est limité à 1Go par fichier.

J’ai donc réfléchi à comment envoyer mes fichiers de backup qui peuvent faire jusqu’à 20Go et je suis tombé sur Forklift 3 qui est développé par Binarynights. Ce logiciel de transfert de fichier est un des meilleurs et des plus rapides que j’ai pu tester et il supporte l’envoie de fichiers avec le protocol S3, justement utilisé par Digital Ocean pour ses « Spaces ».

Connexion à votre Space Digital Ocean

Même si Forklift ne se targue pas d’être compatible avec Digital Ocean, la connexion Amazon S3 est bien compatible et il est très facile de monter une connection sous forme de disque externe vers un Space Digital Ocean.

Pour se faire, il suffit de créer une nouvelle connexion, de choisir le protocol Amazon S3 et d’entrer le serveur et vos identifiants. Pour le serveur, c’est simple, il suffit d’entrer *region*.digitaloceanspaces.com où *region* est la région du datacenter dans lequel est votre Space. Dans mon cas il est dans le datacenter de New York 3, j’utilise donc le « endpoint » : nyc3.digitaloceanspaces.com.  Vous trouverez le votre ici :

Pour ce qui est des identifiants, vous les trouverez dans l’interface Digital Ocean sur la page de vos Spaces. En suivant le lien « Manage keys » :

Forklift est un des meilleurs logiciel de transfert de fichiers.

Voici quelques benchmark qui montre clairement Forklift comme étant le plus rapide des logiciel de transfert de fichiers. Il est vraiment plus rapide que tous ses concurrents et dans tous les types de transferts.

Pour vos backups vers S3 par exemple, c’est bien appréciable d’avoir une rapidité accrue. Pour ma part j’ai envoyé un fichier de backup de 16Go en 5 minutes environ, avec la fibre, mais tout de même.

Conclusion : Forklift est l’outil parfait pour tranférer vos backups sur Digital Ocean Spaces ou sur Amazon S3

Pour essayer ou acheter une license de Forklift 3 c’est sur le site officiel de Binarynights qui est l’éditeur du logiciel. Nous avons obtenu un coupon rabais de 50% de réduction, vous pouvez utiliser le code FL3UNDISC50OFF. Ce coupon est valable jusqu’à la fin Août 2020 et est valide pour les 3 types de licences.

Si vous souhaitez essayer Digital Ocean Spaces ou avoir des serveurs virtuels SSD à pas cher, c’est par ici.

Forcer Chrome en mode clair sous Mac OS

Forcer Chrome en mode clair sous Mac OS

Vous utilisez le mode sombre (dark mode) sur Mac OS mais vous ne souhaitez pas avoir Chrome en mode sombre ? Voici une petite ligne de commande pour forcer Chrome à utiliser le mode clair :

defaults write com.google.Chrome NSRequiresAquaSystemAppearance -bool Yes
Stocker des prix dans PostgreSQL, quel type de données ?

Stocker des prix dans PostgreSQL, quel type de données ?

Un petit aide mémoire pour moi-même, mais peut-être que ça servira à quelques-un d’entre vous ! 

Pour stocker un prix dans PostgreSQL il faut utiliser le type de données (datatype) : 

NUMERIC(precision, scale)

En pratique, par exemple : numeric(7,2) permettra de stocker un prix jusqu’à 99999.99. Il y a donc 7 digits au maximum (precision) et 2 après la virgule. PostgreSQL fera un arrondi de tout chiffre pour stocker uniquement 2 chiffres après la virgule.

Pour l’exemple, 135.784 a une « precision » de 6 et un « scale » de 3

Si le prix est supérieur, alors PostgreSQL retourne une erreur du type :

ERROR:  numeric field overflow
DETAIL:  A field with precision 5, scale 2 must round to an absolute value less than 10^3.
How we spend our day

How we spend our days is, of course, how we spend our lives. What we do with this hour, and that one, is what we are doing.

Annie Dillard