Moien, Frënn. Ier Dir op den zweeten Deel vun der Mee Vakanz fort geet, deele mir Iech d'Material dat mir iwwersat hunn an Erwaardung op de Start vun engem neie Stream um Cours
Applikatioun Entwéckler verbréngen vill Zäit fir verschidde operationell Datenbanken ze vergläichen fir deen ze wielen deen am Beschten déi geplangten Aarbechtslaascht passt. Bedierfnesser kënne vereinfacht Datemodelléierung, Transaktiounsgarantien, Lies- / Schreifleistung, horizontale Skaléieren a Feelertoleranz enthalen. Traditionell fänkt d'Wiel mat der Datebankkategorie un, SQL oder NoSQL, well all Kategorie e klore Set vu Ofwäichunge presentéiert. Héich Leeschtung a punkto gerénger latency an héijen Duerchgang gëtt allgemeng als net-trade-off Ufuerderung ugesinn an ass dofir wesentlech fir all Probe-Datebank.
Den Zweck vun dësem Artikel ass d'Applikatioun Entwéckler ze hëllefen déi richteg Wiel tëscht SQL an NoSQL am Kontext vun der Applikatiounsdatenmodelléierung ze maachen. Mir kucken op eng SQL Datebank, nämlech PostgreSQL, an zwou NoSQL Datenbanken, Cassandra a MongoDB, fir d'Basis vum Datebankdesign ze decken, sou wéi Tabellen erstellen, se populéieren, Daten aus enger Tabell liesen an se läschen. Am nächsten Artikel wäerte mir sécher sinn Indexen, Transaktiounen, JOINs, TTL Direktiven, an JSON-baséiert Datebankdesign ze kucken.
Wat ass den Ënnerscheed tëscht SQL an NoSQL?
SQL Datenbanken erhéijen d'Applikatiounsflexibilitéit duerch ACID Transaktiounsgarantien, souwéi hir Fäegkeet fir Daten ze froen mat JOINs op onerwaarte Weeër uewen op existent normaliséierter relational Datebankmodeller.
Wéinst hirer monolithescher / eenzeger Node Architektur an der Notzung vun engem Master-Sklave Replikatiounsmodell fir Redundanz, fehlen traditionell SQL Datenbanken zwee wichteg Features - linear Schreif Skalierbarkeet (dh automatesch Partitionéierung iwwer verschidde Noden) an automatesch / Null Dateverloscht. Dëst bedeit datt d'Quantitéit vun den empfangenen Donnéeën net de maximale Schreifduerchgang vun engem eenzegen Node kann iwwerschreiden. Zousätzlech, muss e puer temporärer Dateverloscht a Feeler Toleranz berücksichtegt ginn (an enger gemeinsamer-näischt Architektur). Hei musst Dir am Kapp behalen datt rezent Verpflichtungen nach net an der Sklave Kopie reflektéiert goufen. Net-Downtime Updates sinn och schwéier an SQL Datenbanken z'erreechen.
NoSQL Datenbanken ginn normalerweis vun Natur verdeelt, d.h. an hinnen, Daten sinn an Sektiounen ënnerdeelt an iwwer e puer Wirbelen verdeelt. Si erfuerderen Denormaliséierung. Dëst bedeit datt déi aginn Donnéeën och e puer Mol musse kopéiert ginn fir op déi spezifesch Ufroen ze reagéieren déi Dir schéckt. D'allgemeng Zil ass eng héich Leeschtung ze kréien duerch d'Reduktioun vun der Zuel vun Shards verfügbar während Liesen. Dëst implizéiert datt NoSQL Iech erfuerdert Är Ufroen ze modelléieren, während SQL erfuerdert datt Dir Är Donnéeën modelléiert.
NoSQL konzentréiert sech op d'Erreeche vun héijer Leeschtung an engem verdeelte Stärekoup an dëst ass d'Basisdaten Begrënnung fir vill Datebank Design Tradeoffs déi ACID Transaktiounsverloscht, JOINs, a konsequent global sekundär Indizes enthalen.
Et gëtt en Argument datt wärend NoSQL Datenbanken linear Schreif Skalierbarkeet an héich Feeler Toleranz ubidden, de Verloscht vun Transaktiounsgarantien mécht se net gëeegent fir missionskritesch Donnéeën.
Déi folgend Tabell weist wéi Datenmodelléierung an NoSQL sech vun SQL ënnerscheet.
SQL an NoSQL: Firwat si béid gebraucht?
Real-Welt Uwendungen mat grousser Zuel vu Benotzer, wéi Amazon.com, Netflix, Uber, an Airbnb, sinn opgefuerdert komplex, villsäiteg Aufgaben auszeféieren. Zum Beispill, eng E-Commerce Applikatioun wéi Amazon.com muss liicht, héichkritesch Donnéeën wéi Benotzerinformatioun, Produkter, Bestellungen, Rechnungen, zesumme mat schwéieren, manner sensiblen Donnéeën wéi Produktbewertungen, Supportmeldungen, Benotzeraktivitéit, Benotzer Kritik a Recommandatiounen. Natierlech vertrauen dës Uwendungen op d'mannst eng SQL Datebank zesumme mat op d'mannst eng NoSQL Datebank. A cross-regional a global Systemer funktionéiert eng NoSQL Datebank als geo-verdeelt Cache fir Daten, déi an enger vertrauter Quell SQL-Datebank an enger eenzeger Regioun lafen.
Wéi kombinéiert YugaByte DB SQL an NoSQL?
Gebaut op engem logorientéierte gemëschte Späichermotor, Auto-Sharding, sharded verdeelt Konsens Replikatioun an ACID verdeelt Transaktiounen (inspiréiert vu Google Spanner), YugaByte DB ass déi éischt Open Source Datebank vun der Welt déi gläichzäiteg kompatibel ass mat NoSQL (Cassandra & Redis) an SQL (PostgreSQL). Wéi an der Tabell hei ënnendrënner, YCQL, de YugaByte DB API kompatibel mat Cassandra, füügt d'Konzepter vun eenzelen a Multi-Schlëssel ACID Transaktiounen a global sekundär Indexen un d'NoSQL API un, an doduerch d'Ära vun der Transaktiouns NoSQL Datenbanken. Zousätzlech, YCQL, de YugaByte DB API kompatibel mat PostgreSQL, füügt d'Konzepter vun der linearer Schreifskaléierung an der automatescher Feelertoleranz op d'SQL API bäi, bréngt verdeelt SQL-Datenbanken op d'Welt. Well YugaByte DB transaktiounsfäeg ass, kann d'NoSQL API elo am Kontext vu missionskriteschen Donnéeën benotzt ginn.
Wéi virdrun am Artikel gesot
- Wann Är primär Aarbechtsbelaaschtung Multi-Schlëssel JOIN Operatiounen ass, da wann Dir YSQL auswielt, verstitt datt Är Schlësselen iwwer verschidde Wirbelen verdeelt kënne ginn, wat zu enger méi héijer Latenz an / oder méi nidderegen Duerchsatz resultéiert wéi NoSQL.
- Soss, wielt entweder vun den zwee NoSQL APIen, bedenkt datt Dir besser Leeschtung kritt als Resultat vun Ufroen, déi vun engem Node gläichzäiteg zerwéiert ginn. YugaByte DB kann als eenzeg operationell Datebank fir real-Welt, komplex Uwendungen déngen, déi gläichzäiteg verschidde Aarbechtslaascht musse managen.
Den Datemodelléierungslabo an der nächster Sektioun baséiert op PostgreSQL a Cassandra API kompatiblen YugaByte DB Datenbanken, am Géigesaz zu gebierteg Datenbanken. Dës Approche betount d'Liichtegkeet vun der Interaktioun mat zwee verschiddenen APIen (op zwee verschiddene Ports) vum selwechte Datebankcluster, am Géigesaz zu komplett onofhängege Cluster vun zwou verschiddenen Datenbanken.
An de folgende Sektioune kucke mir den Datemodelléierungslabo fir d'Ënnerscheeder an e puer vun de Gemeinsamkeeten vun den iwwerdeckten Datenbanken ze illustréieren.
Datemodelléierungslaboratoire
Datebank Installatioun
Gitt de Schwéierpunkt op Datemodelldesign (anstatt komplex Deploymentarchitekturen), wäerte mir Datenbanken an Docker Container op der lokaler Maschinn installéieren an dann mat hinnen interagéieren andeems se hir jeweileg Kommandozeil Shells benotzen.
PostgreSQL & Cassandra kompatibel YugaByte DB Datebank
mkdir ~/yugabyte && cd ~/yugabyte
wget https://downloads.yugabyte.com/yb-docker-ctl && chmod +x yb-docker-ctl
docker pull yugabytedb/yugabyte
./yb-docker-ctl create --enable_postgres
MongoDB
docker run --name my-mongo -d mongo:latest
Kommando Linn Zougang
Loosst eis mat den Datenbanken verbannen mat der Kommandozeil Shell fir déi entspriechend APIen.
PostgreSQL
docker exec -it yb-postgres-n1 /home/yugabyte/postgres/bin/psql -p 5433 -U postgres
Cassandra
cqlsh
am Katalog bin
.
Notéiert datt CQL vun SQL inspiréiert gouf an ähnlech Konzepter vun Dëscher, Reihen, Kolonnen an Indexen huet. Wéi och ëmmer, als NoSQL Sprooch füügt et e gewësse Set vu Beschränkungen un, déi meescht vun deenen mir och an aneren Artikelen ofdecken.
docker exec -it yb-tserver-n1 /home/yugabyte/bin/cqlsh
MongoDB
docker exec -it my-mongo bash
cd bin
mongo
Schafen en Dësch
Elo kënne mir mat der Datebank interagéieren fir verschidde Operatiounen mat der Kommandozeil auszeféieren. Loosst eis ufänken mat engem Dësch ze kreéieren deen Informatioun iwwer Lidder späichert vu verschiddene Kënschtler. Dës Lidder kënnen Deel vun engem Album sinn. Och fakultativ Attributer fir e Lidd sinn d'Joer vun der Verëffentlechung, Präis, Genre a Bewäertung. Mir mussen zousätzlech Attributer berücksichtegen, déi an Zukunft duerch de Feld "Tags" gebraucht kënne ginn. Et kann semi-strukturéiert Donnéeën a Form vun Schlëssel-Wäert Pairen späicheren.
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)
);
Cassandra
En Dësch an Cassandra erstellen ass ganz ähnlech wéi PostgreSQL. Ee vun den Haaptunterschiede ass de Mangel un Integritéitsbeschränkungen (zB NET NULL), awer dëst ass d'Verantwortung vun der Applikatioun, net d'NoSQL Datebank. De primäre Schlëssel besteet aus engem Partitionsschlëssel (d'Kënschtler Kolonn am Beispill hei ënnen) an eng Rei vu Clustering Kolonnen (d'SongTitle Kolonn am Beispill hei ënnen). De Partitionsschlëssel bestëmmt op wéi eng Partition / Shard d'Zeil soll plazéiert ginn, an d'Clustering Kolonnen weisen wéi d'Donnéeën am aktuellen Shard solle organiséiert ginn.
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)
);
MongoDB
MongoDB organiséiert Daten an Datenbanken (Datebase) (ähnlech wéi Keyspace zu Cassandra), wou et Sammlungen sinn (ähnlech wéi Dëscher) déi Dokumenter enthalen (ähnlech wéi Reihen an enger Tabell). Am MongoDB ass et am Fong kee Besoin fir en initial Schema ze definéieren. Equipe "Datebank benotzen", hei ënnendrënner ugewisen, instantiéiert d'Datebank um éischten Uruff an ännert de Kontext fir déi nei erstallt Datebank. Och Sammlungen mussen net explizit erstallt ginn, si ginn automatesch erstallt, einfach wann Dir dat éischt Dokument an eng nei Sammlung bäidréit. Notéiert datt MongoDB d'Testdatenbank als Standard benotzt, sou datt all Sammlungsniveau Operatioun ouni eng spezifesch Datebank ze spezifizéieren als Standard drop leeft.
use myNewDatabase;
Kréien Informatiounen iwwert en Dësch
PostgreSQL
d Music
Table "public.music"
Column | Type | Collation | Nullable | Default
--------------+-----------------------+-----------+----------+--------
artist | character varying(20) | | not null |
songtitle | character varying(30) | | not null |
albumtitle | character varying(25) | | |
year | integer | | |
price | double precision | | |
genre | character varying(10) | | |
criticrating | double precision | | |
tags | text | | |
Indexes:
"music_pkey" PRIMARY KEY, btree (artist, songtitle)
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;
Gitt Daten an eng Tabell
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}'
);
Cassandra
Allgemeng Ausdrock INSERT
an Cassandra gesäit ganz ähnlech aus wéi am PostgreSQL. Wéi och ëmmer, et gëtt e groussen Ënnerscheed an der Semantik. An der Cassandra INSERT
ass eigentlech eng Operatioun UPSERT
, wou déi lescht Wäerter an d'Zeil bäigefüügt ginn wann d'Zeil scho existéiert.
Dateentrée ass ähnlech wéi PostgreSQL
INSERT
méi héich
.
MongoDB
Och wann MongoDB eng NoSQL Datebank wéi Cassandra ass, huet seng Insertiounsoperatioun näischt gemeinsam mam semantesche Verhalen vu Cassandra. An MongoDB UPSERT
, wat et ähnlech wéi PostgreSQL mécht. Dobäizemaachen Standarddaten ouni _idspecified
wäert en neit Dokument an d'Kollektioun bäidroen.
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"
}
}
);
Dësch Query
Vläicht ass de bedeitendsten Ënnerscheed tëscht SQL an NoSQL a punkto Ufrokonstruktioun d'Sprooch déi benotzt gëtt FROM
и WHERE
. SQL erlaabt no Ausdrock FROM
wielt MÉI Dëscher, an Ausdrock mat WHERE
kann vun all Komplexitéit sinn (inklusiv Operatiounen JOIN
tëscht Dëscher). Wéi och ëmmer, NoSQL tendéiert eng schwéier Limitatioun op FROM
, a schafft nëmme mat engem spezifizéierten Dësch, an an WHERE
, muss de primäre Schlëssel ëmmer spezifizéiert ginn. Dëst verbënnt mat der NoSQL Performance Push, iwwer déi mir virdru geschwat hunn. Dëse Wonsch féiert zu all méiglech Reduktioun vun all Kräiz-Tabulär a Kräiz-Schlëssel Interaktioun. Et kann e grousst Verspéidung an der Inter-Node Kommunikatioun aféieren wann Dir op eng Ufro reagéiert an ass dofir am Beschten allgemeng vermeit. Zum Beispill erfuerdert d'Cassandra Ufroe fir verschidde Betreiber limitéiert ze sinn (nëmmen =, IN, <, >, =>, <=
) op Partitionsschlësselen, ausser wann Dir e sekundären Index ufrot (nëmmen den = Bedreiwer ass hei erlaabt).
PostgreSQL
Drënner sinn dräi Beispiller vu Ufroen déi einfach vun enger SQL Datebank ausgefouert kënne ginn.
- Weist all Lidder vun engem Kënschtler;
- Weist all Lidder vum Kënschtler déi mam éischten Deel vum Titel passen;
- Weist all Lidder vun engem Kënschtler déi e bestëmmt Wuert am Titel hunn an e Präis manner wéi 1.00 hunn.
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;
Cassandra
Vun de PostgreSQL Ufroen uewen opgezielt, funktionnéiert nëmmen déi éischt onverännert an Cassandra, well de Bedreiwer LIKE
kann net op Clustering Sailen applizéiert ginn wéi z SongTitle
. An dësem Fall sinn nëmmen Opérateuren erlaabt =
и IN
.
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;
MongoDB
Wéi an de fréiere Beispiller gewisen, ass d'Haaptmethod fir Ufroen an MongoDB ze kreéieren music
am Beispill hei ënnen), sou datt et verbueden ass fir verschidde Sammlungen ze froen.
db.music.find( {
artist: "No One You Know"
}
);
db.music.find( {
artist: "No One You Know",
songTitle: /Call/
}
);
Liesen all Zeile vun engem Dësch
All Zeilen liesen ass einfach e spezielle Fall vum Ufromuster dat mir virdru gekuckt hunn.
PostgreSQL
SELECT *
FROM Music;
Cassandra
Ähnlech wéi de PostgreSQL Beispill hei uewen.
MongoDB
db.music.find( {} );
Änneren Daten an enger Tabell
PostgreSQL
PostgreSQL bitt Instruktiounen UPDATE
Donnéeën ze änneren. Si huet keng Méiglechkeeten UPSERT
, also wäert dës Ausso versoen wann d'Zeil net méi an der Datebank ass.
UPDATE Music
SET Genre = 'Disco'
WHERE Artist = 'The Acme Band' AND SongTitle = 'Still In Love';
Cassandra
Cassandra huet UPDATE
ähnlech wéi PostgreSQL. UPDATE
huet déi selwecht Semantik UPSERT
, ähnlech INSERT
.
Ähnlech wéi de PostgreSQL Beispill hei uewen.
MongoDB
Operatioun UPSERT
. MÉI Dokumenter aktualiséieren an ähnlecht Verhalen UPSERT
kann applizéiert ginn andeems Dir zousätzlech Fändelen fir d'Operatioun setzt. Zum Beispill, am Beispill hei ënnen, gëtt de Genre vun engem spezifesche Kënschtler op Basis vu sengem Lidd aktualiséiert.
db.music.update(
{"artist": "The Acme Band"},
{
$set: {
"genre": "Disco"
}
},
{"multi": true, "upsert": true}
);
Ewechzehuelen Daten aus engem Dësch
PostgreSQL
DELETE FROM Music
WHERE Artist = 'The Acme Band' AND SongTitle = 'Look Out, World';
Cassandra
Ähnlech wéi de PostgreSQL Beispill hei uewen.
MongoDB
MongoDB huet zwou Aarte vu Operatiounen fir Dokumenter ze läschen -
db.music.deleteMany( {
artist: "The Acme Band"
}
);
En Dësch läschen
PostgreSQL
DROP TABLE Music;
Cassandra
Ähnlech wéi de PostgreSQL Beispill hei uewen.
MongoDB
db.music.drop();
Konklusioun
D'Debatt iwwer d'Wiel tëscht SQL an NoSQL ass zënter méi wéi 10 Joer rëselt. Et ginn zwee Haaptaspekter zu dëser Debatt: Datebankmotorarchitektur (monolithesch, transaktionell SQL vs verdeelt, net-transaktionell NoSQL) an Datebankdesign Approche (Modelleréieren Är Donnéeën an SQL vs Modelléiere vun Ären Ufroen an NoSQL).
Mat enger verdeeler Transaktiounsdatenbank wéi YugaByte DB, kann d'Debatt iwwer d'Datebankarchitektur ganz einfach gesat ginn. Wéi Datenvolumen méi grouss ginn wéi dat wat an engem eenzegen Node geschriwwe ka ginn, gëtt eng voll verdeelt Architektur déi linear Schreifskalierbarkeet mat automatescher Scherpung / Rebalancing ënnerstëtzt.
Ausserdeem, wéi et an engem vun den Artikelen steet
Zréck op d'Datebankdesign Diskussioun, et ass fair ze soen datt béid Design Approche (SQL an NoSQL) fir all komplex real-Welt Applikatioun noutwendeg sinn. D'SQL "Datemodelléierung" Approche erlaabt d'Entwéckler méi einfach verännert Geschäftsbedéngungen z'erreechen, während d'NoSQL "Query Modeling" Approche erlaabt déiselwecht Entwéckler op grousse Volumen vun Daten mat gerénger latency an héijen Duerchsatz ze bedreiwen. Et ass aus dësem Grond datt YugaByte DB SQL an NoSQL APIen an engem gemeinsame Kär ubitt, anstatt eng vun den Approchen ze förderen. Zousätzlech, andeems Dir Kompatibilitéit mat populäre Datebanksproochen ubitt, dorënner PostgreSQL a Cassandra, suergt YugaByte DB datt d'Entwéckler keng aner Sprooch musse léieren fir mat engem verdeelen, héich konsequent Datebankmotor ze schaffen.
An dësem Artikel hu mir gekuckt wéi Datebank Design Fundamenter tëscht PostgreSQL, Cassandra a MongoDB ënnerscheeden. An zukünfteg Artikelen dauchte mir an fortgeschratt Designkonzepter wéi Indizes, Transaktiounen, JOINs, TTL Direktiven, an JSON Dokumenter.
Mir wënschen Iech e schéine Rescht vum Weekend an invitéieren Iech op
Source: will.com