Fondamantal konsepsyon baz done - Konpare PostgreSQL, Cassandra ak MongoDB

Bonjou, zanmi. Anvan nou kite pou dezyèm pati jou ferye me yo, nou pataje avèk ou materyèl nou te tradui an prevwa lansman yon nouvo kouran sou kou a. "DBMS relasyon".

Fondamantal konsepsyon baz done - Konpare PostgreSQL, Cassandra ak MongoDB

Devlopè aplikasyon yo pase anpil tan konpare plizyè baz done operasyonèl yo chwazi youn ki pi byen adapte kantite travay yo gen entansyon. Bezwen yo ka gen ladan modèl done senplifye, garanti tranzaksyon, pèfòmans lekti/ekri, dechèl orizontal, ak tolerans fay. Tradisyonèlman, chwa a kòmanse ak kategori baz done a, SQL oswa NoSQL, paske chak kategori prezante yon seri konpwomi klè. Pèfòmans segondè an tèm de latansi ki ba ak gwo debi jeneralman konsidere kòm yon egzijans ki pa komès epi kidonk li esansyèl pou nenpòt baz done echantiyon.

Objektif atik sa a se ede devlopè aplikasyon yo fè bon chwa ant SQL ak NoSQL nan yon kontèks modèl done aplikasyon an. Nou pral gade yon baz done SQL, sètadi PostgreSQL, ak de baz done NoSQL, Cassandra ak MongoDB, pou kouvri baz done konsepsyon, tankou kreye tab, peple yo, li done ki soti nan yon tab, epi efase li. Nan pwochen atik la, nou pral asire w ke ou gade endis, tranzaksyon, JOIN, direktiv TTL, ak konsepsyon baz done ki baze sou JSON.

Ki diferans ki genyen ant SQL ak NoSQL?

Baz done SQL ogmante fleksibilite aplikasyon atravè garanti ACID tranzaksyon, osi byen ke kapasite yo nan rechèch done lè l sèvi avèk JOIN nan fason inatandi sou tèt modèl baz done nòmalize ki egziste deja.

Etandone achitekti monolitik / yon sèl-nœud yo ak itilizasyon yon modèl replikasyon mèt-esklav pou redondance, baz done SQL tradisyonèl yo manke de karakteristik enpòtan - évolutivité ekri lineyè (sa vle di otomatik patisyon atravè plizyè nœuds) ak otomatik/zewo pèt done. Sa vle di ke kantite done resevwa pa ka depase maksimòm debi ekri nan yon sèl ne. Anplis de sa, gen kèk pèt done tanporè dwe pran an kont nan tolerans fay (nan yon achitekti pataje-pa gen anyen). Isit la ou bezwen kenbe nan tèt ou ke komèt resan yo poko te reflete nan kopi esklav la. Mizajou ki pa D 'yo tou difisil pou reyalize nan baz done SQL.

NoSQL baz done yo anjeneral distribye pa lanati, i.e. nan yo, done yo divize an seksyon ak distribye atravè plizyè nœuds. Yo mande denormalization. Sa vle di ke done yo antre yo dwe kopye tou plizyè fwa pou reponn a demann espesifik ou voye yo. Objektif jeneral la se pou jwenn gwo pèfòmans lè w redwi kantite shards ki disponib pandan lekti. Sa vle di ke NoSQL mande pou ou modèl demann ou yo, pandan y ap SQL mande pou ou modèl done ou yo.

NoSQL konsantre sou reyalize pèfòmans segondè nan yon gwoup distribye e sa a se rezon ki kache pou anpil konpwomi konsepsyon baz done ki gen ladan pèt tranzaksyon ACID, JOIN, ak endis segondè mondyal ki konsistan.

Gen yon agiman ke pandan ke baz done NoSQL yo bay évolutivité ekri lineyè ak tolerans fòt segondè, pèt la nan garanti tranzaksyon fè yo pa apwopriye pou done misyon kritik.

Tablo sa a montre kouman modèl done nan NoSQL diferan de SQL.

Fondamantal konsepsyon baz done - Konpare PostgreSQL, Cassandra ak MongoDB

SQL ak NoSQL: Poukisa tou de nesesè?

Aplikasyon nan mond reyèl la ak yon gwo kantite itilizatè yo, tankou Amazon.com, Netflix, Uber, ak Airbnb, gen responsablite pou fè travay konplèks ak plizyè aspè. Pou egzanp, yon aplikasyon e-commerce tankou Amazon.com bezwen estoke done ki lejè, ki gen anpil kritik tankou enfòmasyon itilizatè, pwodwi, lòd, fakti, ansanm ak done lou, mwens sansib tankou revizyon pwodwi, mesaj sipò, aktivite itilizatè, revizyon itilizatè ak rekòmandasyon. Natirèlman, aplikasyon sa yo konte sou omwen yon baz done SQL ansanm ak omwen yon baz done NoSQL. Nan sistèm kwa-rejyonal ak mondyal, yon baz done NoSQL opere kòm yon kachèt geo-distribiye pou done ki estoke nan yon baz done SQL sous ou fè konfyans ki kouri nan yon rejyon an patikilye.

Ki jan YugaByte DB konbine SQL ak NoSQL?

Bati sou yon motè depo melanje oryante boutèy demi lit, oto-sharding, sharded distribiye konsansis replikasyon ak ACID distribye tranzaksyon (enspire pa Google Spanner), YugaByte DB se premye baz done sous louvri nan mond lan ki an menm tan konpatib ak NoSQL (Cassandra & Redis) ak SQL (PostgreSQL). Jan yo montre nan tablo ki anba a, YCQL, YugaByte DB API konpatib ak Cassandra, ajoute konsèp nan tranzaksyon sèl ak milti-kle ACID ak endèks segondè mondyal nan NoSQL API, kidonk inogirasyon nan epòk la nan baz done tranzaksyon NoSQL. Anplis de sa, YCQL, YugaByte DB API ki konpatib ak PostgreSQL, ajoute konsèp nan echèl ekri lineyè ak tolerans otomatik fay nan SQL API a, pote baz done SQL distribiye nan mond lan. Paske YugaByte DB se tranzaksyon nati, API NoSQL kapab kounye a dwe itilize nan yon kontèks done misyon kritik.

Fondamantal konsepsyon baz done - Konpare PostgreSQL, Cassandra ak MongoDB

Kòm deja endike nan atik la "Entwodwi YSQL: Yon PostgreSQL konpatib distribiye API SQL pou YugaByte DB", chwa ki genyen ant SQL oswa NoSQL nan YugaByte DB depann antyèman sou karakteristik chaj travay ki kache:

  • Si travay prensipal ou a se operasyon JOIN milti-kle, lè sa a lè w ap chwazi YSQL, konprann ke kle ou yo ka distribye atravè plizyè nœuds, sa ki lakòz pi gwo latansi ak/oswa pi ba debi pase NoSQL.
  • Sinon, chwazi youn nan de API NoSQL yo, kenbe nan tèt ou ke w ap jwenn pi bon pèfòmans kòm yon rezilta demann yo sèvi nan yon sèl ne nan yon moman. YugaByte DB ka sèvi kòm yon sèl baz done operasyonèl pou aplikasyon konplèks nan mond reyèl la ki bezwen jere kantite travay plizyè ansanm.

Laboratwa modèl done nan pwochen seksyon an baze sou baz done YugaByte DB konpatib PostgreSQL ak Cassandra API, kontrèman ak baz done natif natal. Apwòch sa a mete aksan sou fasilite pou kominike avèk de API diferan (sou de pò diferan) nan menm gwoup baz done, kontrèman ak itilize grap konplètman endepandan nan de baz done diferan.
Nan seksyon sa yo, nou pral pran yon gade nan laboratwa modèl done yo pou ilistre diferans ki genyen ak kèk nan komen nan baz done yo kouvri.

Done Modeling Laboratwa

Enstalasyon baz done

Bay anfaz sou konsepsyon modèl done (olye ke achitekti deplwaman konplèks), nou pral enstale baz done nan resipyan Docker sou machin lokal la epi answit kominike avèk yo lè l sèvi avèk kokiy liy lòd yo.

PostgreSQL & Cassandra konpatib baz done YugaByte DB

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

Aksè liy kòmand

Ann konekte nan baz done yo lè l sèvi avèk koki liy lòd pou API korespondan yo.

Postgrèskl

psql se yon kokiy liy lòd pou kominike avèk PostgreSQL. Pou fasilite yo itilize, YugaByte DB vini ak psql dwa nan katab bin la.

docker exec -it yb-postgres-n1 /home/yugabyte/postgres/bin/psql -p 5433 -U postgres

Cassandra

cqlsh se yon kokiy liy lòd pou kominike avèk Cassandra ak baz done konpatib li yo atravè CQL (Cassandra Query Language). Pou fasilite yo itilize, YugaByte DB vini ak cqlsh nan katalòg la bin.
Remake byen ke CQL te enspire pa SQL epi li gen konsèp ki sanble nan tab, ranje, kolòn ak endèks. Sepandan, kòm yon lang NoSQL, li ajoute yon seri sèten limit, pi fò nan yo nou pral kouvri tou nan lòt atik.

docker exec -it yb-tserver-n1 /home/yugabyte/bin/cqlsh

MongoDB

Mongo se yon kokiy liy lòd pou kominike avèk MongoDB. Ou ka jwenn li nan anyè bin enstalasyon MongoDB.

docker exec -it my-mongo bash 
cd bin
mongo

Kreye yon tab

Koulye a, nou ka kominike avèk baz done a pou fè plizyè operasyon lè l sèvi avèk liy lòd la. Ann kòmanse pa kreye yon tab ki estoke enfòmasyon sou chante ekri pa diferan atis. Chante sa yo ka fè pati yon album. Epitou atribi opsyonèl pou yon chante yo se ane lage, pri, genre ak evalyasyon. Nou bezwen kont pou atribi adisyonèl ki ka bezwen nan lavni nan jaden an "Tags". Li ka estoke done semi-estriktire nan fòm pè kle-valè.

Postgrèskl

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

Kreye yon tab nan Cassandra sanble anpil ak PostgreSQL. Youn nan diferans prensipal yo se mank de kontrent entegrite (egzanp PA NULL), men sa a se responsablite aplikasyon an, pa baz done NoSQL.. Kle prensipal la konsiste de yon kle patisyon (kolòn Atis la nan egzanp ki anba a) ak yon seri kolòn gwoup (kolon SongTitle nan egzanp ki anba a). Kle patisyon an detèmine nan ki patisyon/teson ranje a ta dwe mete, epi kolòn gwoupman yo endike kijan done yo ta dwe òganize nan shard aktyèl la.

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 òganize done nan baz done (Baz done) (menm jan ak Keyspace nan Cassandra), kote gen Koleksyon (menm jan ak tab) ki gen Dokiman (menm jan ak ranje nan yon tab). Nan MongoDB, fondamantalman pa gen okenn nesesite pou defini yon premye chema. Ekip "itilize baz done", montre anba a, enstansye baz done a sou premye apèl la epi chanje kontèks la pou baz done ki fèk kreye a. Menm koleksyon yo pa bezwen kreye klèman; yo kreye otomatikman, tou senpleman lè ou ajoute premye dokiman an nan yon nouvo koleksyon. Remake byen ke MongoDB sèvi ak baz done tès la pa default, kidonk nenpòt operasyon nan nivo koleksyon san yo pa espesifye yon baz done espesifik pral kouri sou li pa default.

use myNewDatabase;

Jwenn enfòmasyon sou yon tab
Postgrèskl

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;

Antre done nan yon tab
Postgrèskl

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

Ekspresyon jeneral INSERT nan Cassandra sanble anpil ak sa ki nan PostgreSQL. Sepandan, gen yon gwo diferans nan semantik. Nan Cassandra INSERT se aktyèlman yon operasyon UPSERT, kote dènye valè yo ajoute nan ranje a si ranje a deja egziste.

Antre done se menm jan ak PostgreSQL INSERT pi wo a

.

MongoDB

Menm si MongoDB se yon baz done NoSQL tankou Cassandra, operasyon ensèsyon li pa gen anyen an komen ak konpòtman semantik Cassandra. Nan MongoDB insert () pa gen okenn opòtinite UPSERT, ki fè li sanble ak PostgreSQL. Ajoute done default san yo pa _idspecified pral lakòz yon nouvo dokiman yo dwe ajoute nan koleksyon an.

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"
}
}
);

Rekèt tab la

Petèt diferans ki pi enpòtan ant SQL ak NoSQL an tèm de konstriksyon rechèch se lang yo itilize FROM и WHERE. SQL pèmèt apre ekspresyon FROM chwazi plizyè tab, ak ekspresyon ak WHERE ka nenpòt ki konpleksite (ki gen ladan operasyon yo JOIN ant tab yo). Sepandan, NoSQL gen tandans enpoze yon limit grav sou FROM, epi travay sèlman ak yon tab espesifye, ak nan WHERE, yo dwe toujou presize kle prensipal la. Sa a lye nan pouse pèfòmans NoSQL nou te pale sou pi bonè. Dezi sa a mennen nan tout rediksyon posib nan nenpòt entèraksyon kwa-tabul ak kwa-kle. Li ka prezante yon gwo reta nan kominikasyon entè-ne lè reponn a yon demann epi se poutèt sa pi byen evite an jeneral. Pou egzanp, Cassandra mande pou demann yo limite a sèten operatè (sèlman =, IN, <, >, =>, <=) sou kle patisyon yo, eksepte lè w ap mande yon endèks segondè (se sèlman operatè a = pèmèt isit la).

Postgrèskl

Anba a se twa egzanp demann ki ka fasilman egzekite pa yon baz done SQL.

  • Montre tout chante yon atis;
  • Montre tout chante atis la ki matche ak premye pati tit la;
  • Montre tout chante yon atis ki gen yon sèten mo nan tit la epi ki gen yon pri mwens pase 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;

Cassandra

Nan demann PostgreSQL ki nan lis pi wo a, sèlman premye a pral travay san okenn chanjman nan Cassandra, depi operatè a. LIKE pa ka aplike nan gwoup kolòn tankou SongTitle. Nan ka sa a, sèlman operatè yo gen dwa = и 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

Jan yo montre nan egzanp anvan yo, metòd prensipal la pou kreye demann nan MongoDB se db.collection.find(). Metòd sa a gen klèman non koleksyon an (music nan egzanp ki anba a), kidonk li entèdi fè rechèch sou plizyè koleksyon.

db.music.find( {
  artist: "No One You Know"
 } 
);
db.music.find( {
  artist: "No One You Know",
  songTitle: /Call/
 } 
);

Lekti tout ranje yon tab

Lekti tout ranje se tou senpleman yon ka espesyal nan modèl rechèch nou te gade pi bonè.

Postgrèskl

SELECT * 
FROM Music;

Cassandra

Menm jan ak egzanp PostgreSQL ki anwo a.

MongoDB

db.music.find( {} );

Edite done nan yon tablo

Postgrèskl

PostgreSQL bay enstriksyon yo UPDATE pou chanje done yo. Li pa gen okenn opòtinite UPSERT, kidonk deklarasyon sa a ap echwe si ranje a pa nan baz done a ankò.

UPDATE Music
SET Genre = 'Disco'
WHERE Artist = 'The Acme Band' AND SongTitle = 'Still In Love';

Cassandra

Cassandra genyen UPDATE menm jan ak PostgreSQL. UPDATE gen menm semantik UPSERT, menm jan an INSERT.

Menm jan ak egzanp PostgreSQL ki anwo a.

MongoDB
Operasyon aktyalizasyon () nan MongoDB ka konplètman mete ajou yon dokiman ki egziste deja oswa mete ajou sèlman sèten jaden. Pa default, li sèlman mete ajou yon dokiman ak semantik enfim UPSERT. Mete ajou plizyè dokiman ak konpòtman menm jan an UPSERT ka aplike pa mete drapo adisyonèl pou operasyon an. Pou egzanp, nan egzanp ki anba a, genre a nan yon atis espesifik mete ajou dapre chante l 'yo.

db.music.update(
  {"artist": "The Acme Band"},
  { 
    $set: {
      "genre": "Disco"
    }
  },
  {"multi": true, "upsert": true}
);

Retire done nan yon tab

Postgrèskl

DELETE FROM Music
WHERE Artist = 'The Acme Band' AND SongTitle = 'Look Out, World';

Cassandra

Menm jan ak egzanp PostgreSQL ki anwo a.

MongoDB

MongoDB gen de kalite operasyon pou efase dokiman - deleteOne() /deleteMany() и retire (). Tou de kalite efase dokiman men retounen rezilta diferan.

db.music.deleteMany( {
        artist: "The Acme Band"
    }
);

Efase yon tab

Postgrèskl

DROP TABLE Music;

Cassandra

Menm jan ak egzanp PostgreSQL ki anwo a.

MongoDB

db.music.drop();

Konklizyon

Deba sou chwa ant SQL ak NoSQL te move pou plis pase 10 ane. Gen de aspè prensipal nan deba sa a: achitekti motè baz done (monolitik, tranzaksyon SQL vs distribye, ki pa tranzaksyon NoSQL) ak apwòch konsepsyon baz done (modele done ou nan SQL vs modèl demann ou yo nan NoSQL).

Avèk yon baz done tranzaksyon distribiye tankou YugaByte DB, deba a sou achitekti baz done ka fasilman sispann. Kòm volim done yo vin pi gwo pase sa ki ka ekri nan yon sèl ne, yon achitekti konplètman distribye ki sipòte évolutivité ekri lineyè ak sharding/rebalanse otomatik vin nesesè.

Anplis, jan sa di nan youn nan atik yo Google nwaj,Achitekti tranzaksyon, fòtman konsistan yo kounye a plis ,itilize bay pi bon ladrès devlopman pase achitekti ki pa tranzaksyon, ,evantyèlman konsistan.

Retounen nan diskisyon konsepsyon baz done a, li jis pou di ke tou de apwòch konsepsyon (SQL ak NoSQL) yo nesesè pou nenpòt aplikasyon konplèks nan mond reyèl la. Apwòch SQL "modelizasyon done" pèmèt devlopè yo pi fasil satisfè kondisyon biznis k ap chanje, pandan y ap apwòch "modelizasyon rechèch" NoSQL pèmèt menm devlopè yo opere sou gwo volim done ak latansi ki ba ak gwo debi. Se pou rezon sa a ke YugaByte DB bay SQL ak NoSQL API nan yon nwayo komen, olye ke ankouraje youn nan apwòch yo. Anplis de sa, lè yo bay konpatibilite ak lang baz done popilè ki gen ladan PostgreSQL ak Cassandra, YugaByte DB asire ke devlopè yo pa bezwen aprann yon lòt lang pou travay avèk yon motè baz done distribye ki trè konsistan.

Nan atik sa a, nou te gade ki jan fondamantal konsepsyon baz done diferan ant PostgreSQL, Cassandra, ak MongoDB. Nan pwochen atik, nou pral plonje nan konsèp konsepsyon avanse tankou endèks, tranzaksyon, JOIN, direktiv TTL, ak dokiman JSON.

Nou swete w yon bon rès nan fen semèn nan epi envite ou webinar gratis, ki pral fèt 14 me.

Sous: www.habr.com

Add nouvo kòmantè