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.
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.
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.
Kòm deja endike nan atik la
- 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
docker exec -it yb-postgres-n1 /home/yugabyte/postgres/bin/psql -p 5433 -U postgres
Cassandra
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
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 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 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 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 -
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
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
Sous: www.habr.com