NoSQL pour l'entreprise

Qt relationnel EDB

Qu'est-ce que Postgres NoSQL pour l'entreprise ?

Postgres NoSQL est l'association puissante de technologies de base de données déstructurées et relationnelles dans un même système de gestion de base de données pour l'entreprise. Postgres NoSQL offre la liberté, la flexibilité et les performances nécessaires au traitement de données déstructurées et semi-structurées tout en préservant leur viabilité à long terme en tant qu'informations pour l'entreprise.

Les technologies de stockage de documents et de valeurs clés de Postgres offrent les avantages des nouvelles technologies NoSQL en plus de la possibilité de les intégrer dans des infrastructures traditionnelles de données d'entreprise en évitant les silos de données, la complexité opérationnelle, la perte de l'intégrité des données et les risques.

 

La base de données complète de documents

Postgres a associé le célèbre format JSON à son moteur de transactions éprouvé ACID. Cette combinaison originale apporte à l'utilisateur une remarquable souplesse en termes de charge de travail sur la plateforme la plus économique reconnue par l'industrie.

Une solution de base de données complète doit aujourd'hui souvent gérer le problème de l'intégrité des transactions mais également des volumes d'information sans précédent, des vitesses et des débits de données croissants et une grande diversité de formats de données. De nouvelles technologies sont apparues qui se spécialisent dans l'optimisation d'un ou deux de ces aspects, tout en sacrifiant les autres.

Postgres associé à JSON aborde les besoins des utilisateurs de manière plus globale et gère avec succès le traitement de la majorité des charges de travail NoSQL. Pour plus de détail, lisez le livre blanc PostgreSQL Advances to Meet NoSQL Challenges.

 

ACID ou BASE ?

Les règles d'Atomicité, de Cohérence, d'Isolation et de Durabilité (ACID) qui ont orienté la technologie des bases de données depuis des décennies ont permis de garantir la validité, la cohérence et la protection des ressources les plus précieuses de l'entreprise : ses données. Les technologies NoSQL à elles seules ne satisfont pas aux règles ACID car elles sacrifient la protection des données critiques en faveur des performances haut débit pour les applications déstructurées. Elles ont pour propriétés d'être essentiellement disponibles (Basic Availability) d'avoir un état variable dans le temps (Soft State) et d'être éventuellement cohérentes (Eventual Consistency), d'où l'acronyme BASE, ce qui peut être acceptable lorsque les risques sont faibles comme la perte d'un message texte ou le déplacement d'un jeton dans un jeu multi-joueur.

Si les solutions NoSQL peuvent garantir l'Atomicité dans un même document, cela ne suffit pas pour la plupart des systèmes d'entreprise qui entretiennent des relations vitales entre plusieurs ensembles de données désagrégées qu'elles soient structurées ou déstructurées. Grâce aux fonctionnalités NoSQL de Postgres, il devient facile d'intégrer des portions critiques de vos données destructurées dans vos données à gestion traditionnelle tout en conservant les avantages en termes de performances, d'agilité et de destructuration offerts par les outils NoSQL.

 

Simplicité

La rédaction d'applications pour les réseaux sociaux ou mobiles est un jeu d'enfant avec Postgres qui supporte Javascript, Python, Ruby, node.js, JSON, Key-Values, geo-spatial et XML.

Sans renoncer à leurs outils agiles préférés, les développeurs peuvent facilement améliorer l'expérience utilisateur, accélérer la commercialisation et réduire leurs coûts.

 

Évolutivité

L'augmentation explosive du nombre d'utilisateurs de Postgres est en partie due à sa capacité éprouvée à prendre en charge des systèmes à haut débit où des milliers d'utilisateurs traitent des volumes considérables de données. Sauf lorsque les volumes sont proprement gigantesques, Postgres permet à de nombreux utilisateurs simultanés de traiter des grandes quantités d'informations. 

  • xDB Replication Server d'EDB est une solution évolutive non virtualisée en lecture. xDB en configuration multi-master permet à l'une des plus grandes compagnies téléphoniques des États-Unis de bénéficier d'une évolutivité en lecture et de la disponibilité en écriture. 
  • EDB Failover Manager crée des clusters de bases de données à tolérance de panne qui, en cas de défaillance d'une base de données maîtresse, maintiennent les données en ligne dans des configurations à très haute disponibilité. 
  • Les configurations et les solutions Postgres à grande échelle peuvent être gérées, suivies et configurées de manière professionnelle avec EDB Postgres Enterprise Manager et ses fonctionnalités complètes comme des tableaux de bord de performances, des alertes d'état critique, la planification de capacité, des analyseurs de journaux et bien plus encore.

 

Performance

Postgres satisfait aujourd'hui aux besoins les plus exigeants des plus grandes compagnies d'assurance, banques, sociétés de courtage, agences gouvernementales et fournisseurs militaires du monde, et cela depuis des années.  Les performances de Postgres progressent de manière continue avec chaque nouvelle version annuelle et concernent également les types de données destructurées pris en charge.

 

EDB vous invite à tester par vous-même les performances NoSQL de Postgres. Téléchargez pg_nosql_benchmark  sur GitHub et donnez-nous votre avis.

Comparaison Document/Base de données relationnelles

Pour aborder intelligemment les nouvelles technologies, il est nécessaire d'évaluer de près vos besoins et les outils susceptibles d'y répondre. Le tableau ci-dessous compare les caractéristiques d'une base de données orientée NoSQL Document (commeas MongoDB) et celles de la base de données relationnelles / Document de Postgres pour que vous puissiez déterminer par vous-même la solution qui vous convient.

Fonctionnalités MongoDB PostgreSQL
Début du développement Open Source 2009 1995
Schémas Dynamique Statique et dynamique
Prend en charge les données des documents hiérarchisés Oui Oui (depuis 2012)
Prend en charge les données de valeur clé Oui Oui (depuis 2006)
Prend en charge le stockage des données relationnelles / formulaires normalisés Non Oui
Contraintes de données Non Oui
Taille maximale du document 16 Mo 1 000 Mo
Association des données Très difficile Très facile
Langage d'interrogation normalisé puissant Non Oui
Prise en charge des transactions et contrôles de concurrence multiversion Non Oui
Transactions atomiques Dans le même document Dans toute la base de données
Langages de développement Web supportés JavaScript, Python, Ruby, et plus encore. JavaScript, Python, Ruby, et plus encore.
Prise en charge du format commun des données Web JSON (Document), Key-Value, XML JSON (Document), Key-Value, XML
Prise en charge géospatiale Oui Oui
Chemin le plus simple vers le changement d'échelle Évolutivité horizontale Évolutivité verticale
Sharding Facile Complexe
Programmation côté serveur Aucun Nombreux langages procéduraux comme Python, JavaScript, C,C++, Tcl, Perl et bien d'autres
Intégration facile avec d'autres banques de données Non, il crée des silos de données Oui, gestionnaires de données externes (Foreign Data Wrappers) vers Oracle, MySQL, MongoDB, CouchDB, Redis, Neo4j, Twitter, LDAP, File, Hadoop et plus encore.
Logique métier Intégré dans et distribué sur les applications client. Centralisée avec déclencheurs et procédures enregistrées, ou distribuée sur les applications clients
Disponibilité des ressources compétentes Difficile à trouver Facile à trouver
Utilisations principales Données volumineuses (en milliards d'enregistrements) avec mises à jour simultanées importantes lorsque l'intégrité des données et la cohérence ne sont pas exigées. Applications transactionnelles et opérationnelles qui s'appuient sur des formulaires normalisés, l'agrégation de données, les contraintes et la prise en charge transactionnelle.

 

Pour plus d'informations sur les fonctionnalités de JSON dans Postgres...

Postgres prend en charge les données structurées et déstructurées

Les technologies NoSQL comme les bases de documents et les bases de clé-valeur, supportent les méthodologies de développement incrémentiel dans lesquelles les modèles de données émergent à mesure que l'application passe par des cycles de développement agile au lieu d'être soigneusement élaborés par avance à l'aide de diagrammes ER, l'analyse des formulaires normaux et les cadres d'architecture conceptuelle/logique/physique.

NoSQL et ACID ensemble

Postgres a introduit JSON (2012) et HSTORE (2006) pour apporter aux architectes et aux développeurs de solutions une option de gestion de données sans schéma entièrement intégrée dans le robuste modèle ACID (Atomique, Cohérent, Isolé et Durable) de Postgres.

 

Prise en charge du type de données JSON

Postgres offre une prise en charge robuste et complète pour l'insertion de données JSON avec analyseur de validation, stockage et un large éventail de fonctions pour l'extraction des éléments dans les documents JSON.

 

JSON en entrée et JSON en sortie

Postgres permet également de coder facilement les ensembles de résultats des requêtes en JSON : les développeurs d'applications qui préfèrent travailler directement sous JSON peuvent aisément obtenir leurs données depuis Postgres dans leur format d'origine.

 

Document et données clé-valeur

Depuis 2006, Postgres propose également HSTORE pour la prise en charge clé-valeur mais, à la différence des autres solutions NoSQL seul, la base clé-valeur créée dans Postgres est compatible ACID. Tout comme JSON, HSTORE peut servir à émuler une base de données sans schéma lorsque cela est souhaitable. Il existe également des fonctions qui convertissent les données clé-valeur gérées par Postgres en données au format JSON ce qui accroît la flexibilité et l'éventail des applications de type NoSQL qui peuvent être adressées par Postgres.

 

JSON et Javascript

Postgres fournit des fonctionnalités Javascript dans la base de données elle-même pour permettre aux développeurs Web d'écrire du code logique pour base de données centralisée à l'aide du même moteur JavaScript que celui de leurs clients Web. Développé par Google pour Chrome, V8 est conçu pour fonctionner sur le client et le serveur. Il est également au cœur de Node.js. V8 est disponible sous forme de module complémentaire PL/V8 de Postgres.Avec Postgres, vos développeurs peuvent également travailler dans la base de données avec le format de leurs données Web et dans leur langage d'application.

 

Postgres : quand la précision compte

Postgres 9.4 s'est enrichi de JSONB, un deuxième type JSON avec format de stockage binaire qui est significativement différent de BSON, le format utilisé par l'un des plus grands fournisseurs de bases de données documents seuls. BSON est un diminutif pour Binary JSON, mais toutes les valeurs JSON ne peuvent pas être représentées par BSON. C'est notamment le cas des nombres entiers ou en virgule flottant d'une longueur de plus de 64 bits, alors que JSONB peut représenter n'importe quelle valeur arbitraire de JSON.

Pour plus d'informations sur les fonctionnalités de JSON dans Postgres...

Opérateurs et fonctions JSON/JSONB dans Postgres

Les tableaux ci-après présentent le nombre impressionnant d'opérateurs et de fonctions disponibles pour stocker, récupérer, convertir, manipuler et créer des données JSON dans un environnement relationnel Postgres. Lorsque ces fonctionnalités sont associées au format clé-valeur (HSTORE), la recherche en texte intégral, trigramme et de voisinage immédiat, l'indexation GIN et GiST, les tables « Unlogged », la prise en charge de XML, les gestionnaires de données externes (comme MongoDB, CouchDB et Redis), et le paramétrage de la validation asynchrone pour la cohérence éventuelle de Postgres, vous constaterez que vous n'avez plus besoin d'aucune autre base de données spécialisée pour traiter toutes vos données déstructurées.

Les types de données JSON de Postgres permettent de stocker les données JSON (JavaScript Object Notation) conformément à la RFC 7159. The JSON data type stores an exact copy of the input text, which processing functions must reparse on each execution; while JSONB data is stored in a decomposed binary format that makes it slightly slower to input due to added conversion overhead, but significantly faster to process, since no reparsing is needed. JSONB also supports indexing, which can be a significant advantage.

 

Le tableau ci-dessous récapitule les opérateurs utilisables avec les deux types de données JSON, à savoir JSON et JSONB.

Opérateurs JSON et JSONB
Opérateur Type d'opérande droite Description
–> int Récupère un élément de tableau JSON (indexé à partir de zéro, entiers négatifs comptabilisés à la fin du tableau)
–> text Récupère un champ d'objet JSON par sa clé
–>> int Récupère un élément de tableau JSON en tant que texte
–>> text Récupère un champ d'objet JSON en tant que texte
#> text[ ] Récupère un objet JSON avec le chemin spécifié
#> text[ ] Récupère un objet JSON en tant que texte avec le chemin spécifié

 

D'autres opérateurs sont réservés à JSONB, le format de stockage binaire pour JSON.

Autres opérateurs JSONB
Opérateur Type d'opérande droite Description
@> jsonb Est-ce que la valeur JSON de gauche contient les entrées chemin/valeur JSON de droite dans le niveau supérieur ?
<@ jsonb Est-ce que les entrées chemin/valeur JSON de gauche figurant au niveau supérieur sont affichées dans la valeur JSON de droite ?
? text Est-ce que la chaîne existe en tant que clé de niveau supérieur dans la valeur JSON ?
?| text[ ] Est-ce que l'un de ces tableaux de chaînes existe en tant que clés de niveau supérieur ?
?& text[ ] Est-ce que tous ces tableaux de chaînes existent en tant que clés de niveau supérieur ?
| | jsonb Concatène deux valeurs jsonb en une nouvelle valeur jsonb.
- text Supprime la paire clé/valeur ou la chaîne élément de l'opérande de gauche. Des correspondances sont établies entre les paires clé/valeur en fonction de la valeur de leur clé.
- entier Supprime l'élément de tableau avec l'index spécifié (entiers négatifs comptabilisés à la fin du tableau). Une erreur est renvoyée si le conteneur de niveau supérieur n'est pas un tableau.
#- text[] Supprime le champ ou l'élément avec le chemin spécifié (pour les tableaux JSON, entiers négatifs comptabilisés à la fin du tableau).

 

Ce tableau présente les fonctions disponibles pour la création de valeurs JSON. Il n'existe actuellement pas de fonction équivalente pour JSONB mais vous pouvez convertir le résultat ces fonctions en JSON.

Fonctions de création JSON
Fonction Description
to_json(tout_élément)

to_jsonb(anyelement)

Renvoie la valeur json ou jsonb. Les tableaux et éléments composites sont convertis de manière récursive en tableaux et objets. À défaut, en cas de conversion du type en json, la fonction cast sera utilisée pour effectuer la conversion, sinon une valeur scalaire sera générée. Pour tous les types scalaires autres qu'une valeur numérique, booléenne ou nulle, la représentation texte sera utilisée de manière à obtenir une valeur json ou jsonb valide.
array_to_json(tout_tableau [, pretty_bool]) Renvoie le tableau en tant que tableau JSON. Un tableau multidimensionnel PostgreSQL devient un tableau de tableaux JSON. Si pretty_bool est vrai, des sauts de ligne sont ajoutés entre les éléments de dimension-1.
row_to_json(enregistrement [, pretty_bool]) Renvoie la ligne en tant qu'objet JSON. Si pretty_bool est vrai, des sauts de ligne sont ajoutés entre les éléments de niveau-1.
json_build_array(VARIADIC "toute_valeur")

jsonb_build_array(VARIADIC "any")

Construit un tableau JSON de type éventuellement hétérogène à partir d'une liste variadique d'arguments.
json_build_object(VARIADIC "toute_valeur")

jsonb_build_object(VARIADIC "any")

Crée un objet JSON à partir d'une liste variadique d'arguments. Par convention, la liste d'arguments se compose d'une alternance de clés et de valeurs.
json_object(text[ ])

jsonb_object(text[ ])

Crée un objet JSON à partir d'un tableau texte. Le tableau doit avoir une seule dimension avec un nombre pair de membres (qui sont alors traités comme une liste alternée de paires clé/valeurs) ou deux dimensions de sorte que chaque tableau intérieur possède exactement deux éléments qui sont considérés comme une paire clé/valeur.
json_object(keys text[ ], values text[ ])

jsonb_object(keys text[ ], values text[ ])

Cette forme de json_object récupère les clés et les valeurs par paires dans deux tableaux distincts. Elle est par ailleurs identique à la forme avec un seul argument.

 

Le dernier tableau présente les fonctions pour le traitement des valeurs JSON et JSONB.

Fonctions de traitement JSON
Fonction Type renvoyé Description
json_array_length(json)

jsonb_array_length(jsonb)

int renvoie le nombre d'éléments dans le tableau JSON le plus à l'extérieur.
json_each(json)

jsonb_each(jsonb)

Ensemble clé texte, valeur json

Ensemble clé texte, valeur jsonb

Développe l'objet JSON le plus éloigné en ensemble de paires clé/valeur.
json_each_text(json)

jsonb_each_text(jsonb)

Ensemble de clé texte,

valeur texte

Développe l'objet JSON le plus éloigné en ensemble de paires clé/valeur. Les valeurs renvoyées sont de type texte.
json_extract_path(from_json json, VARIADIC path_elems text[ ])

jsonb_extract_path(from_jsonb jsonb, VARIADIC path_elems text[ ])

json

jsonb

Renvoie la valeur JSON désignée par path_elems (équivaut à l'opérateur #>).
json_extract_path_text(from_json json, VARIADIC path_elems text[ ])

jsonb_extract_path_text(from_json jsonb, VARIADIC path_elems text[ ])

test Renvoie sous forme texte la valeur JSON désignée par path_elems (équivaut à l'opérateur #>>).
json_object_keys(json)

jsonb_object_keys(jsonb)

Ensemble de texte Renvoie l'ensemble de clés dans l'objet JSON le plus à l'extérieur.
json_populate_record(base anyelement, from_json json)

jsonb_populate_record(base anyelement, from_json jsonb)

tout_élément Développe l'objet de from_json dans une ligne dont les colonnes correspondent au type d'enregistrement défini par base (voir note ci-dessous).
json_populate_recordset(base anyelement, from_json json)

jsonb_populate_recordset(base anyelement, from_json jsonb)

Ensemble de tout_élément Développe le tableau le plus extérieur d'objet dans from_json en un ensemble de lignes dont les colonnes correspondent au type d'enregistrement défini par base (voir note ci-dessous).
json_array_elements(json)

jsonb_array_elements(jsonb)

Ensemble de json

Ensemble de jsonb

Développe un tableau JSON en ensemble de valeurs JSON.
json_array_elements_text(json)

jsonb_array_elements_text(jsonb)

Ensemble de texte Développe un tableau JSON en ensemble de valeurs texte.
json_typeof(json)

jsonb_typeof(jsonb)

text Renvoie sous forme de chaîne texte le type de la valeur JSON la plus à l'extérieur. Les types possibles sont object, array, string, number, boolean et null.
json_to_record(json)

jsonb_to_record(jsonb)

enregistrement Construit un enregistrement arbitraire à partir d'un objet JSON (voir note ci-dessous). Comme pour toutes les fonctions qui renvoient des enregistrements, l'appelant doit définir de manière explicite la structure de l'enregistrement au moyen d'une clause AS.
json_to_recordset(json)

jsonb_to_recordset(jsonb)

ensemble d'enregistrements Construit un ensemble arbitraire d'enregistrements à partir d'un tableau JSON d'objets (voir note ci-dessous). Comme pour toutes les fonctions qui renvoient des enregistrements, l'appelant doit définir de manière explicite la structure de l'enregistrement au moyen d'une clause AS.
json_strip_nulls(from_json json)

jsonb_strip_nulls(from_json jsonb)

json

jsonb

Renvoie tous les champs object de _json contenant des valeurs null omises. Les autres valeurs null resteront intactes.
jsonb_set(target jsonb, path text[], new_value jsonb[, create_missing boolean]) jsonb Renvoie target avec la section désignée par path et remplacée par new_value ou new_value added, si create_missing affiche true (la valeur par défaut est true) et que l'élément désigné par path n'existe pas. Comme avec les opérateurs orientés chemin, des entiers négatifs apparaissent dans le décompte path à la fin des tableaux JSON.
jsonb_pretty(from_json jsonb) text Renvoie from_jason en tant que texte JSON indenté.

 

Cliquez ici pour le manuel de référence complet des fonctions et opérateurs JSON avec des exemples d'utilisation et de résultats.

 

Pour plus d'informations sur les fonctionnalités de JSON dans Postgres...

Votre avis nous intéresse !

Nous souhaitons améliorer notre site Web et votre aide nous est très précieuse ! N'hésitez pas à nous donner votre avis sur le contenu de notre site Web :

Répondre à l'enquête >>

Tutoriel PG XDK

PostgreSQL XDK vous permet d'explorer les possibilités NoSQL de PostgreSQL. 

Apprenez à manipuler vos données JSON avec PostgreSQL 9.4 avec ce tutoriel gratuit sur Amazon Web Services.

Manuel de démarrage rapide de PG XDK

Télécharger PostgreSQL

 

NoSQL Webcast

Greater Developer Flexibility with NoSQL in EDB Postgres

NoSQL will give developers control over the data to be stored within the database without having to rely on a DBA to implement changes. This presentation will give an overview of what NoSQL is, briefly what the pros and cons are, and includes a demo of the NoSQL functionality in EDB Postgres to allow you to better choose the best data management solution for your use case.
 

Évaluez NoSQL

Découvrez par vous-même les performances de Postgres sur les données déstructurées par rapport à celles de MongoDB

Téléchargez Postgres NoSQL Benchmark et effectuez vos propres tests !

Télécharger PostgreSQL