Bonjour mes amis. Avant de partir pour la deuxiÚme partie des vacances de mai, nous partageons avec vous le matériel que nous avons traduit la veille du lancement d'un nouveau stream au rythme du
«SGBD relationnel» .

Les développeurs d'applications passent beaucoup de temps à comparer plusieurs bases de données d'exploitation pour choisir celle qui convient le mieux à leur charge de travail prévue. Les besoins peuvent inclure une modélisation des données simplifiée, des garanties transactionnelles, des performances de lecture / écriture, une mise à l'échelle horizontale et une tolérance aux pannes. Par tradition, le choix commence par une catégorie de base de données, SQL ou NoSQL, car chaque catégorie fournit un ensemble clair de compromis. Des performances élevées en termes de faible latence et de débit élevé sont généralement considérées comme une exigence de compromis et sont donc nécessaires pour toute base de données de l'échantillon.
Le but de cet article est d'aider les développeurs d'applications à faire le bon choix entre SQL et NoSQL dans le contexte de la modélisation des données d'application. Nous examinerons une base de données SQL, à savoir PostgreSQL et deux bases de données NoSQL - Cassandra et MongoDB, pour parler des bases de la conception de bases de données, telles que la création de tables, leur remplissage, la lecture des données de la table et leur suppression. Dans le prochain article, nous examinerons certainement les index, les transactions, les JOIN, les directives TTL et la conception de bases de données basées sur JSON.
Quelle est la différence entre SQL et NoSQL?Les bases de données SQL augmentent la flexibilité des applications grùce aux garanties transactionnelles ACID, ainsi que leur capacité à interroger des données à l'aide de JOIN de maniÚre inattendue en plus des modÚles de bases de données relationnelles normalisées existantes.
Compte tenu de leur architecture monolithique / Ă nĆud unique et de l'utilisation d'un modĂšle de rĂ©plication maĂźtre-esclave pour la redondance, les bases de donnĂ©es SQL traditionnelles n'ont pas deux caractĂ©ristiques importantes - l'Ă©volutivitĂ© linĂ©aire de l'enregistrement (c'est-Ă -dire le fractionnement automatique en plusieurs nĆuds) et la perte de donnĂ©es automatique / nulle. Cela signifie que la quantitĂ© de donnĂ©es reçues ne peut pas dĂ©passer le dĂ©bit d'Ă©criture maximal d'un nĆud. De plus, certaines pertes de donnĂ©es temporaires doivent ĂȘtre prises en compte lors de la tolĂ©rance aux pannes (dans une architecture sans partage de ressources). Ici, vous devez garder Ă l'esprit que les validations rĂ©centes n'ont pas encore Ă©tĂ© reflĂ©tĂ©es dans la copie esclave. Les mises Ă jour sans interruption sont Ă©galement difficiles Ă rĂ©aliser dans les bases de donnĂ©es SQL.
Les bases de donnĂ©es NoSQL sont gĂ©nĂ©ralement distribuĂ©es par nature, c'est-Ă -dire en eux, les donnĂ©es sont divisĂ©es en sections et rĂ©parties sur plusieurs nĆuds. Ils nĂ©cessitent une dĂ©normalisation. Cela signifie que les donnĂ©es saisies doivent Ă©galement ĂȘtre copiĂ©es plusieurs fois afin de rĂ©pondre aux demandes spĂ©cifiques que vous envoyez. L'objectif global est d'obtenir des performances Ă©levĂ©es en rĂ©duisant le nombre de fragments disponibles lors de la lecture. Il suit la dĂ©claration selon laquelle NoSQL vous oblige Ă modĂ©liser vos requĂȘtes, tandis que SQL vous oblige Ă modĂ©liser vos donnĂ©es.
NoSQL se concentre sur la réalisation de hautes performances dans un cluster distribué, et c'est la principale justification de nombreux compromis de conception de base de données qui incluent les ACID de perte de transaction, les JOIN et les index secondaires mondiaux cohérents.
On pense que bien que les bases de données NoSQL offrent une évolutivité d'écriture linéaire et une tolérance élevée aux pannes, la perte de garanties transactionnelles les rend inadaptées aux données critiques.
Le tableau suivant montre en quoi la modélisation des données dans NoSQL diffÚre de SQL.
SQL et NoSQL: Pourquoi les deux sont-ils nécessaires?Les applications du monde réel avec un grand nombre d'utilisateurs, comme Amazon.com, Netflix, Uber et Airbnb, exécutent des tùches complexes et variées. Par exemple, une application de commerce électronique comme Amazon.com doit stocker des données légÚres et hautement critiques, telles que des informations sur les utilisateurs, les produits, les commandes, les factures, ainsi que des données lourdes mais moins sensibles, telles que les avis sur les produits, les messages d'assistance , activité des utilisateurs, avis des utilisateurs et recommandations. Naturellement, ces applications reposent sur au moins une base de données SQL avec au moins une base de données NoSQL. Dans les systÚmes interrégionaux et mondiaux, la base de données NoSQL fonctionne comme un cache géo-distribué pour les données stockées dans une source de confiance, une base de données SQL, fonctionnant dans n'importe quelle région.
Comment YugaByte DB combine-t-il SQL et NoSQL?Construit sur un moteur de stockage mixte orientĂ© journal, un partage automatique, une rĂ©plication de consensus distribuĂ© et des transactions distribuĂ©es ACID (inspirĂ© de Google Spanner), YugaByte DB est la premiĂšre base de donnĂ©es open source au monde Ă ĂȘtre simultanĂ©ment compatible avec NoSQL (Cassandra & Redis ) et SQL (PostgreSQL). Comme indiquĂ© dans le tableau ci-dessous, YSQL, l'API de base de donnĂ©es YugaByte compatible Cassandra, ajoute les concepts de transactions ACID Ă clĂ© unique et multi-clĂ©s et les index secondaires globaux aux API NoSQL, ouvrant ainsi l'Ăšre des bases de donnĂ©es transactionnelles NoSQL. De plus, YSQL, une API de base de donnĂ©es YugaByte conforme Ă PostgreSQL, ajoute la notion de mise Ă l'Ă©chelle linĂ©aire des enregistrements et de tolĂ©rance aux pannes automatique Ă l'API SQL, introduisant les bases de donnĂ©es SQL distribuĂ©es dans le monde. Ătant donnĂ© que la base de donnĂ©es YugaByte DB est essentiellement transactionnelle, l'API NoSQL peut dĂ©sormais ĂȘtre utilisĂ©e dans le contexte de donnĂ©es critiques.

Comme indiqué précédemment dans l'article
«Présentation de YSQL: une API SQL distribuée compatible PostgreSQL pour YugaByte DB» , le choix entre SQL ou NoSQL dans YugaByte DB dépend entiÚrement des caractéristiques de la charge de travail principale:
- Si la charge de travail principale est des opĂ©rations multi-clĂ©s avec JOIN, alors lorsque vous choisissez YSQL, sachez que vos clĂ©s peuvent ĂȘtre rĂ©parties sur plusieurs nĆuds, ce qui entraĂźnera un dĂ©lai plus Ă©levĂ© et / ou un dĂ©bit infĂ©rieur Ă celui de NoSQL.
- Sinon, sĂ©lectionnez l'une des deux API NoSQL, en gardant Ă l'esprit que vous obtiendrez de meilleures performances Ă la suite de requĂȘtes servies Ă partir d'un nĆud Ă la fois. YugaByte DB peut servir de base de donnĂ©es opĂ©rationnelle unique pour des applications complexes et rĂ©elles dans lesquelles vous devez gĂ©rer plusieurs charges de travail en mĂȘme temps.
Le laboratoire de modĂ©lisation des donnĂ©es de la section suivante est basĂ© sur les bases de donnĂ©es YugaByte DB compatibles avec PostgreSQL et l'API Cassandra, contrairement aux bases de donnĂ©es source. Cette approche met l'accent sur la facilitĂ© d'interaction avec deux API diffĂ©rentes (sur deux ports diffĂ©rents) du mĂȘme cluster de base de donnĂ©es, par opposition Ă l'utilisation de clusters complĂštement indĂ©pendants de deux bases de donnĂ©es diffĂ©rentes.
Dans les sections suivantes, nous rencontrerons le laboratoire de modélisation des données pour illustrer les différences et certaines caractéristiques communes des bases de données en question.
Laboratoire de modĂ©lisation des donnĂ©esInstallation de la base de donnĂ©esĂtant donnĂ© l'accent mis sur la conception d'un modĂšle de donnĂ©es (plutĂŽt que sur des architectures de dĂ©ploiement complexes), nous installerons les bases de donnĂ©es dans des conteneurs Docker sur l'ordinateur local, puis nous interagirons avec eux Ă l'aide de leurs shells de ligne de commande correspondants.
Compatible avec PostgreSQL et Cassandra, base de données YugaByte DBmkdir ~/yugabyte && cd ~/yugabyte wget https://downloads.yugabyte.com/yb-docker-ctl && chmod +x yb-docker-ctl docker pull yugabytedb/yugabyte ./yb-docker-ctl create
Mongodb docker run
AccÚs en ligne de commandeConnectons-nous aux bases de données à l'aide du shell de ligne de commande pour les API correspondantes.
PostgreSQLpsql est un shell de ligne de commande pour interagir avec PostgreSQL. Pour plus de facilité d'utilisation, YugaByte DB est livré avec psql directement dans le dossier bin.
docker exec -it yb-postgres-n1 /home/yugabyte/postgres/bin/psql -p 5433 -U postgres
Cassandracqlsh est un shell en ligne de commande pour interagir avec Cassandra et ses bases de données compatibles via CQL (Cassandra query language). Pour faciliter l'utilisation, YugaByte DB est livré avec
cqlsh
dans le
bin
.
Notez que CQL a été inspiré par SQL et a des concepts similaires aux tables, lignes, colonnes et index. Cependant, en tant que langage NoSQL, il ajoute un certain ensemble de restrictions, dont la plupart seront également couvertes dans d'autres articles.
docker exec -it yb-tserver-n1 /home/yugabyte/bin/cqlsh
Mongodbmongo est un shell de ligne de commande pour interagir avec MongoDB. Il se trouve dans le répertoire bin de l'installation de MongoDB.
docker exec -it my-mongo bash cd bin mongo
CrĂ©ation de tableNous pouvons maintenant interagir avec la base de donnĂ©es pour effectuer diverses opĂ©rations Ă l'aide de la ligne de commande. Commençons par crĂ©er un tableau qui stocke des informations sur les chansons Ă©crites par diffĂ©rents artistes. Ces chansons peuvent faire partie d'un album. Attributs Ă©galement facultatifs pour la chanson - annĂ©e de sortie, prix, genre et classement. Nous devons considĂ©rer les attributs supplĂ©mentaires qui pourraient ĂȘtre nĂ©cessaires Ă l'avenir via le champ "tags". Il peut stocker des donnĂ©es semi-structurĂ©es sous forme de paires clĂ©-valeur.
PostgreSQL CREATE TABLE Music ( Artist VARCHAR(20) NOT NULL, SongTitle VARCHAR(30) NOT NULL, AlbumTitle VARCHAR(25), Year INT, Price FLOAT, Genre VARCHAR(10), CriticRating FLOAT, Tags TEXT, PRIMARY KEY(Artist, SongTitle) );
CassandraLa création d'une table dans Cassandra est trÚs similaire à PostgreSQL.
L'une des principales diffĂ©rences est le manque de contraintes d'intĂ©gritĂ© (par exemple, NOT NULL), mais c'est la responsabilitĂ© de l'application, pas de la base de donnĂ©es NoSQL . La clĂ© primaire se compose d'une clĂ© de section (colonne Artist dans l'exemple ci-dessous) et d'un ensemble de colonnes de clustering (colonne SongTitle dans l'exemple ci-dessous). La clĂ© de partition dĂ©termine la partition / partition dans laquelle placer la ligne et les colonnes de clustering indiquent comment les donnĂ©es doivent ĂȘtre organisĂ©es Ă l'intĂ©rieur de la partition actuelle.
CREATE KEYSPACE myapp; USE myapp; CREATE TABLE Music ( Artist TEXT, SongTitle TEXT, AlbumTitle TEXT, Year INT, Price FLOAT, Genre TEXT, CriticRating FLOAT, Tags TEXT, PRIMARY KEY(Artist, SongTitle) );
MongodbMongoDB organise les donnĂ©es dans des bases de donnĂ©es (Database) (similaires Ă Keyspace dans Cassandra), oĂč il existe des collections (Collections) (similaires aux tableaux), qui contiennent des documents (Documents) (similaires aux lignes d'un tableau). MongoDB ne nĂ©cessite fondamentalement pas la dĂ©finition du schĂ©ma d'origine. La commande
«utiliser la base de donnĂ©es» illustrĂ©e ci-dessous crĂ©e une instance de la base de donnĂ©es lors du premier appel et modifie le contexte de la base de donnĂ©es nouvellement créée. MĂȘme les collections n'ont pas besoin d'ĂȘtre créées explicitement, elles sont créées automatiquement, simplement lorsque vous ajoutez le premier document Ă une nouvelle collection. Veuillez noter que MongoDB utilise la base de donnĂ©es de test par dĂ©faut, par consĂ©quent, toute opĂ©ration au niveau de la collection sans spĂ©cifier de base de donnĂ©es spĂ©cifique y sera effectuĂ©e par dĂ©faut.
use myNewDatabase;
Récupération des informations de table PostgreSQL \d Music Table "public.music" Column | Type | Collation | Nullable | Default
Cassandra DESCRIBE TABLE MUSIC; CREATE TABLE myapp.music ( artist text, songtitle text, albumtitle text, year int, price float, genre text, tags text, PRIMARY KEY (artist, songtitle) ) WITH CLUSTERING ORDER BY (songtitle ASC) AND default_time_to_live = 0 AND transactions = {'enabled': 'false'};
Mongodb use myNewDatabase; show collections;
Publier des données dans une table PostgreSQL INSERT INTO Music (Artist, SongTitle, AlbumTitle, Year, Price, Genre, CriticRating, Tags) VALUES( 'No One You Know', 'Call Me Today', 'Somewhat Famous', 2015, 2.14, 'Country', 7.8, '{"Composers": ["Smith", "Jones", "Davis"],"LengthInSeconds": 214}' ); INSERT INTO Music (Artist, SongTitle, AlbumTitle, Price, Genre, CriticRating) VALUES( 'No One You Know', 'My Dog Spot', 'Hey Now', 1.98, 'Country', 8.4 ); INSERT INTO Music (Artist, SongTitle, AlbumTitle, Price, Genre) VALUES( 'The Acme Band', 'Look Out, World', 'The Buck Starts Here', 0.99, 'Rock' ); INSERT INTO Music (Artist, SongTitle, AlbumTitle, Price, Genre, Tags) VALUES( 'The Acme Band', 'Still In Love', 'The Buck Starts Here', 2.47, 'Rock', '{"radioStationsPlaying": ["KHCR", "KBQX", "WTNR", "WJJH"], "tourDates": { "Seattle": "20150625", "Cleveland": "20150630"}, "rotation": Heavy}' );
CassandraEn général, l'expression
INSERT
dans Cassandra ressemble beaucoup à celle de PostgreSQL. Cependant, il y a une grande différence dans la sémantique. Dans Cassandra,
INSERT
fait une opération
UPSERT
oĂč les derniĂšres valeurs sont ajoutĂ©es Ă la chaĂźne au cas oĂč la chaĂźne existe dĂ©jĂ .
La saisie des données est similaire à PostgreSQL INSERT
ci-dessus
MongodbBien que MongoDB soit une base de données NoSQL, comme Cassandra, son opération d'insertion n'a rien à voir avec le comportement sémantique dans Cassandra. Dans MongoDB,
insert () n'a pas de capacités
UPSERT
, ce qui le fait ressembler à PostgreSQL. L'ajout de données par défaut sans
_idspecified
ajoutera un nouveau document Ă la collection.
db.music.insert( {
artist: "No One You Know",
songTitle: "Call Me Today",
albumTitle: "Somewhat Famous",
year: 2015,
price: 2.14,
genre: "Country",
tags: {
Composers: ["Smith", "Jones", "Davis"],
LengthInSeconds: 214
}
}
);
db.music.insert( {
artist: "No One You Know",
songTitle: "My Dog Spot",
albumTitle: "Hey Now",
price: 1.98,
genre: "Country",
criticRating: 8.4
}
);
db.music.insert( {
artist: "The Acme Band",
songTitle: "Look Out, World",
albumTitle:"The Buck Starts Here",
price: 0.99,
genre: "Rock"
}
);
db.music.insert( {
artist: "The Acme Band",
songTitle: "Still In Love",
albumTitle:"The Buck Starts Here",
price: 2.47,
genre: "Rock",
tags: {
radioStationsPlaying:["KHCR", "KBQX", "WTNR", "WJJH"],
tourDates: {
Seattle: "20150625",
Cleveland: "20150630"
},
rotation: "Heavy"
}
}
);
RequĂȘte de tableLa diffĂ©rence la plus importante entre SQL et NoSQL en termes de conception de requĂȘtes est peut-ĂȘtre l'utilisation des instructions
FROM
et
WHERE
. SQL vous permet de sélectionner plusieurs tables aprÚs une
FROM
, et une
WHERE
peut ĂȘtre de toute complexitĂ© (y compris les opĂ©rations
JOIN
entre les tables). Cependant, NoSQL a tendance Ă imposer une restriction stricte sur
FROM
, et ne fonctionne qu'avec une seule table spécifiée, et dans
WHERE
, la clĂ© primaire doit toujours ĂȘtre spĂ©cifiĂ©e. Cela est dĂ» Ă la volontĂ© d'amĂ©liorer les performances de NoSQL, dont nous avons parlĂ© plus tĂŽt. Ce dĂ©sir conduit Ă toutes les rĂ©ductions possibles de toute interaction croisĂ©e et croisĂ©e. Cela peut entraĂźner un retard important dans la communication inter-nodale lors de la rĂ©ponse Ă une demande et, par consĂ©quent, il est prĂ©fĂ©rable de l'Ă©viter en principe. Par exemple, Cassandra requiert que les requĂȘtes soient limitĂ©es Ă certains opĂ©rateurs (seuls
=, IN, <, >, =>, <=
sont autorisés) sur les clés de partition, sauf lors de la demande d'un index secondaire (seul l'opérateur = est autorisé ici).
PostgreSQLTrois exemples de requĂȘtes qui peuvent ĂȘtre facilement exĂ©cutĂ©es par une base de donnĂ©es SQL seront donnĂ©s ci-dessous.
- Imprimez toutes les chansons de l'artiste;
- Imprimez toutes les chansons de l'artiste qui correspondent Ă la premiĂšre partie du nom;
- Liste toutes les chansons de l'artiste qui ont un mot spécifique dans le titre et ont un prix inférieur à 1,00.
SELECT * FROM Music WHERE Artist='No One You Know'; SELECT * FROM Music WHERE Artist='No One You Know' AND SongTitle LIKE 'Call%'; SELECT * FROM Music WHERE Artist='No One You Know' AND SongTitle LIKE '%Today%' AND Price > 1.00;
CassandraParmi les requĂȘtes PostgreSQL ci-dessus, seule la premiĂšre fonctionnera inchangĂ©e dans Cassandra, car l'instruction
LIKE
ne peut pas ĂȘtre appliquĂ©e aux colonnes de clustering telles que
SongTitle
. Dans ce cas, seuls les opérateurs
=
et
IN
sont autorisés.
SELECT * FROM Music WHERE Artist='No One You Know'; SELECT * FROM Music WHERE Artist='No One You Know' AND SongTitle IN ('Call Me Today', 'My Dog Spot') AND Price > 1.00;
MongodbComme indiquĂ© dans les exemples prĂ©cĂ©dents, la principale mĂ©thode de crĂ©ation de requĂȘtes dans MongoDB est
db.collection.find () . Cette méthode contient explicitement le nom de la collection (
music
dans l'exemple ci-dessous), donc la demande de plusieurs collections est interdite.
db.music.find( { artist: "No One You Know" } ); db.music.find( { artist: "No One You Know", songTitle: /Call/ } );
Lire toutes les lignes du tableauLa lecture de toutes les lignes n'est qu'un cas particulier du modĂšle de requĂȘte que nous avons examinĂ© prĂ©cĂ©demment.
PostgreSQL SELECT * FROM Music;
CassandraSimilaire Ă l'exemple de PostgreSQL ci-dessus.
Mongodb
db.music.find( {} );
Modification des données dans une tablePostgreSQLPostgreSQL fournit une
UPDATE
pour modifier les données. Il n'a pas de capacités
UPSERT
, donc l'exécution de cette instruction échouera si la ligne n'est plus dans la base de données.
UPDATE Music SET Genre = 'Disco' WHERE Artist = 'The Acme Band' AND SongTitle = 'Still In Love';
CassandraCassandra a une
UPDATE
similaire Ă PostgreSQL.
UPDATE
a la mĂȘme sĂ©mantique
UPSERT
INSERT
.
Similaire Ă l'exemple de PostgreSQL ci-dessus.
MongodbL'opération
update () dans MongoDB peut mettre à jour complÚtement un document existant ou mettre à jour uniquement certains champs. Par défaut, il met à jour un seul document avec la sémantique
UPSERT
. La mise Ă jour de plusieurs documents et comportements similaires Ă
UPSERT
peut ĂȘtre appliquĂ©e en dĂ©finissant des indicateurs supplĂ©mentaires pour l'opĂ©ration. Par exemple, dans l'exemple ci-dessous, le genre d'un artiste particulier est mis Ă jour par sa chanson.
db.music.update( {"artist": "The Acme Band"}, { $set: { "genre": "Disco" } }, {"multi": true, "upsert": true} );
Suppression de données d'une tablePostgreSQL DELETE FROM Music WHERE Artist = 'The Acme Band' AND SongTitle = 'Look Out, World';
CassandraSimilaire Ă l'exemple de PostgreSQL ci-dessus.
MongodbMongoDB a deux types d'opérations pour supprimer des documents -
deleteOne () / deleteMany () et
remove () . Les deux types suppriment des documents, mais renvoient des résultats différents.
db.music.deleteMany( { artist: "The Acme Band" } );
Supprimer le tableauPostgreSQL DROP TABLE Music;
CassandraSimilaire Ă l'exemple de PostgreSQL ci-dessus.
Mongodb db.music.drop();
ConclusionLe dĂ©bat sur le choix entre SQL et NoSQL fait rage depuis plus de 10 ans. Il y a deux aspects principaux de ce dĂ©bat: l'architecture du moteur de base de donnĂ©es (monolithique, SQL transactionnel versus distribuĂ©, NoSQL non transactionnel) et l'approche de la conception de la base de donnĂ©es (modĂ©lisation des donnĂ©es en SQL versus modĂ©lisation de vos requĂȘtes en NoSQL).
Avec une base de donnĂ©es transactionnelle distribuĂ©e telle que YugaByte DB, le dĂ©bat sur l'architecture de la base de donnĂ©es peut ĂȘtre facilement dissipĂ©. Comme les volumes de donnĂ©es deviennent plus importants que ce qui peut ĂȘtre Ă©crit sur un seul nĆud, une architecture entiĂšrement distribuĂ©e qui prend en charge l'Ă©volutivitĂ© linĂ©aire des enregistrements avec un partage / rééquilibrage automatique devient nĂ©cessaire.
En plus d'ĂȘtre mentionnĂ©es dans un article de
Google Cloud , les architectures transactionnelles strictement cohérentes sont désormais plus largement utilisées pour offrir une meilleure flexibilité de développement que les architectures non transactionnelles et finalement cohérentes.
Pour en revenir Ă la discussion sur la conception de bases de donnĂ©es, il est juste de dire que les deux approches de conception (SQL et NoSQL) sont nĂ©cessaires pour toute application rĂ©elle complexe. L'approche SQL «modĂ©lisation des donnĂ©es» permet aux dĂ©veloppeurs de rĂ©pondre plus facilement aux besoins changeants de l'entreprise, tandis que l'approche NoSQL «modĂ©lisation des donnĂ©es» permet aux mĂȘmes dĂ©veloppeurs de gĂ©rer de grandes quantitĂ©s de donnĂ©es avec une faible latence et un dĂ©bit Ă©levĂ©. C'est pour cette raison que YugaByte DB fournit des API SQL et NoSQL dans un noyau commun, plutĂŽt que de promouvoir l'une des approches. De plus, en assurant la compatibilitĂ© avec les langages de base de donnĂ©es populaires, y compris PostgreSQL et Cassandra, YugaByte DB garantit que les dĂ©veloppeurs n'ont pas Ă apprendre une autre langue pour travailler avec un moteur de base de donnĂ©es distribuĂ© et strictement cohĂ©rent.
Dans cet article, nous avons compris en quoi les principes fondamentaux de la conception de bases de données diffÚrent dans PostgreSQL, Cassandra et MongoDB. Dans les articles suivants, nous allons plonger dans des concepts de conception avancés tels que les index, les transactions, les JOIN, les directives TTL et les documents JSON.
Nous vous souhaitons un merveilleux séjour le reste du week-end et vous invitons à un
webinaire gratuit , qui se tiendra le 14 mai.