Silav hevalno. Berî ku em biçin beşa duyemîn a betlaneyên Gulanê, em bi we re materyalê ku me wergerandine li hêviya destpêkirina qursek nû ya qursê parve dikin.
Pêşdebirên serîlêdanê gelek dem derbas dikin da ku gelek databasên xebitandinê bidin ber hev da ku ya ku çêtirîn li gorî bargiraniya xebata armanckirî hilbijêrin hilbijêrin. Dibe ku hewcedarî modela daneya hêsan, garantiyên danûstendinê, performansa xwendin / nivîsandinê, pîvana horizontî, û tolerasyona xeletiyê pêk bînin. Bi kevneşopî, vebijark bi kategoriya databasê, SQL an NoSQL dest pê dike, ji ber ku her kategorî komek eşkere ya bazirganiyê pêşkêşî dike. Performansa bilind di warê derengiya kêm û berbi bilind de bi gelemperî wekî hewcedariyek ne-bazirganî tê dîtin û ji ber vê yekê ji bo databasa nimûneyek pêdivî ye.
Armanca vê gotarê ew e ku ji pêşdebirên serîlêdanê re bibe alîkar ku di çarçoveya modela daneya serîlêdanê de di navbera SQL û NoSQL de bijartina rast bikin. Em ê li yek databasa SQL, ango PostgreSQL, û du databasên NoSQL, Cassandra û MongoDB, binihêrin da ku bingehên sêwirana databasê, wekî çêkirina tabloyan, berhevkirina wan, xwendina daneyan ji tabloyek, û jêbirina wê veşêrin. Di gotara din de, em ê bê guman li index, danûstendin, JOIN, rêwerzên TTL, û sêwirana databasa-based JSON binêrin.
Cûdahiya di navbera SQL û NoSQL de çi ye?
Databasên SQL bi navgîniya garantiyên danûstendinê yên ACID, û hem jî kapasîteya wan a lêpirsîna daneyan bi karanîna JOIN-an bi awayên neçaverêkirî li ser modelên databasa têkiliya normalîzekirî ya heyî zêde dike.
Ji ber mîmariya wan a yekparêz/yek-girêk û karanîna modelek dubarekirina master-xulamê ji bo zêdebûnê, databasên SQL-ya kevneşopî du taybetmendiyên girîng tune - pîvandina nivîsandina xêzik (ango dabeşkirina otomatîkî li ser gelek girêkan) û windabûna daneya otomatîk/sifir. Ev tê wê wateyê ku mîqdara daneya ku hatî wergirtin nikare ji karûbarê nivîsandina herî zêde ya yek girêk derbas bibe. Digel vê yekê, hin windabûna daneya demkî divê di tolerasyona xeletiyê de (di mîmariya hevpar-tiştek) de were hesibandin. Li vir hûn hewce ne ku ji bîr mekin ku kiryarên vê dawiyê hîn di kopiya xulamê de nehatine xuyang kirin. Di databasên SQL de gihandina nûvekirinên ne-dorvekirî jî dijwar e.
Daneyên NoSQL bi gelemperî ji hêla xwezayê ve têne belav kirin, ango. di wan de, dane li ser beşan têne dabeş kirin û li çend girêkan têne belav kirin. Ew hewceyê denormalîzasyonê ne. Ev tê vê wateyê ku daneyên ku hatine navnîş kirin jî divê çend caran bêne kopî kirin da ku bersivê bidin daxwazên taybetî yên ku hûn dişînin. Armanca giştî ew e ku bi kêmkirina hejmara şûşeyên ku di dema xwendinê de peyda dibin performansa bilind bidest bixin. Ev tê vê wateyê ku NoSQL ji we re hewce dike ku hûn pirsên xwe model bikin, dema ku SQL hewce dike ku hûn daneyên xwe model bikin.
NoSQL balê dikişîne ser bidestxistina performansa bilind a di komikek belavkirî de, û ev mentiqa bingehîn e ji bo gelek danûstendinên sêwirana databasê ku windabûna danûstendinê ya ACID, JOIN, û navnîşên navîn ên gerdûnî yên domdar vedihewîne.
Argumanek heye ku dema ku databasên NoSQL pîvana nivîsandina xêzik û tolerasyona xeletiya bilind peyda dikin, windabûna garantiyên danûstendinê wan ji bo daneyên mîsyonê-krîtîk neguncaw dike.
Tabloya jêrîn nîşan dide ka çawa modela daneyê di NoSQL de ji SQL cûda dibe.
SQL û NoSQL: Çima herdu jî hewce ne?
Serlêdanên cîhana rastîn ên bi hejmareke mezin bikarhêneran, wekî Amazon.com, Netflix, Uber, û Airbnb, bi pêkanîna karên tevlihev, pir-alî têne peywirdar kirin. Mînakî, serîlêdanek e-bazirganî ya mîna Amazon.com pêdivî ye ku daneyên sivik, krîtîk ên wekî agahdariya bikarhêner, hilber, ferman, fatûre, digel daneyên giran, kêmtir hesas ên wekî nirxandinên hilberê, peyamên piştgirî, çalakiya bikarhêner, hilîne, nirxandin û pêşniyarên bikarhêner. Bi xwezayî, van serîlêdan bi kêmî ve yek databasa SQL û bi kêmî ve yek databasa NoSQL ve girêdayî ye. Di pergalên cross-herêmî û gerdûnî de, databasek NoSQL ji bo daneyên ku li databasa SQL-ya çavkaniyek pêbawer ku li herêmek taybetî tê xebitandin wekî kaşeyek jeo-belavkirî dixebite.
YugaByte DB SQL û NoSQL çawa li hev dike?
YugaByte DB ku li ser motorek hilanîna tevlihev a têketin-rêveberî, xwerû-parvekirin, dubarekirina lihevhatina belavkirî ya perçekirî û danûstendinên belavkirî yên ACID (ji hêla Google Spanner ve hatî îlhamkirin) hatî çêkirin, YugaByte DB yekem databasa çavkaniya vekirî ya cîhanê ye ku di heman demê de bi NoSQL (Cassandra & Redis) re hevaheng e û SQL (PostgreSQL). Wekî ku di tabloya jêrîn de tê xuyang kirin, YCQL, YugaByte DB API-ya ku bi Cassandra-yê re hevaheng e, têgehên danûstendinên ACID-ê yên yek û pir-kilît û navnîşên navîn ên gerdûnî li NoSQL API-yê zêde dike, bi vî rengî serdema databasên NoSQL-ya danûstendinê vedike. Wekî din, YCQL, YugaByte DB API-ya ku bi PostgreSQL-ê re hevaheng e, têgehên pîvana nivîsandina xêz û tolerasyona xeletiya otomatîkî li API-ya SQL zêde dike, databasên SQL-ê yên belavbûyî tîne cîhanê. Ji ber ku YugaByte DB di xwezaya danûstendinê de ye, NoSQL API naha dikare di çarçoveya daneyên mîsyonê-krîtîk de were bikar anîn.
Wekî ku berê di gotarê de hate gotin
- Ger xebata weya bingehîn operasyonên JOIN-ê yên pir-kilît e, wê hingê dema ku YSQL hilbijêrin, fêm bikin ku dibe ku bişkojkên we li gelek girêkan werin belav kirin, ku di encamê de derengbûnek bilindtir û / an jî rêgezek ji NoSQL kêmtir dibe.
- Wekî din, yek ji du NoSQL API-ê hilbijêrin, ji bîr mekin ku hûn ê di encama pirsnameyên ku di yek carî de ji yek girêk têne pêşkêş kirin performansa çêtir bistînin. YugaByte DB dikare ji bo cîhana rastîn, serîlêdanên tevlihev ên ku hewce ne ku bi hevdemî gelek barkêşan birêve bibin wekî databasek xebitandinê ya yekane xizmet bike.
Laboratoriya modela daneyê ya di beşa paşîn de li ser bingehên databasên YugaByte DB-ê yên lihevhatî yên PostgreSQL û Cassandra API-yê ye, berevajî databasên xwemalî. Ev nêzîkatî balê dikişîne ser hêsaniya danûstendina bi du API-yên cihêreng (li ser du portên cihêreng) yên heman komê databasê, berevajî karanîna komên bi tevahî serbixwe yên du databasên cihêreng.
Di beşên jêrîn de, em ê li laboratûara modela daneyê binihêrin da ku cûdahî û hin hevpariyên databasên ku hatine vegirtin destnîşan bikin.
Laboratory Modeling Data
Sazkirina Database
Ji ber giraniya sêwirana modela daneyê (ji bilî mîmarên bicîhkirina tevlihev), em ê databasan di konteynerên Docker-ê de li ser makîneya herêmî saz bikin û dûv re bi wan re bi karanîna şêlên rêza fermanê yên têkildar re têkilî daynin.
Databasa DB ya YugaByte ya bi PostgreSQL & Cassandra re hevaheng e
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
Gihîştina rêza fermanê
Ka em ji bo API-yên têkildar bi karûbarê rêzika fermanê bi databasan ve girêbidin.
PostgreSQL
docker exec -it yb-postgres-n1 /home/yugabyte/postgres/bin/psql -p 5433 -U postgres
Cassandra
cqlsh
di katalogê de bin
.
Bala xwe bidinê ku CQL ji SQL îlhama xwe girtiye û têgînên mîna tablo, rêz, stûn û indexan hene. Lêbelê, wekî zimanek NoSQL, ew komek hin sînoran zêde dike, ku piraniya wan em ê di gotarên din de jî veşêrin.
docker exec -it yb-tserver-n1 /home/yugabyte/bin/cqlsh
MongoDB
docker exec -it my-mongo bash
cd bin
mongo
Çêkirina tabloyekê
Naha em dikarin bi databasê re têkilî daynin da ku bi karanîna rêzika fermanê karên cihêreng bikin. Werin em bi çêkirina tabloyek ku agahdariya li ser stranên ku ji hêla hunermendên cihêreng ve hatine nivîsandin de hilîne dest pê bikin. Dibe ku ev stran beşek albûmekê bin. Di heman demê de taybetmendiyên vebijarkî yên ji bo stranek sala berdanê, biha, celeb û nirx in. Pêdivî ye ku em taybetmendiyên din ên ku dibe ku di pêşerojê de hewce bibin bi riya qada "tags" hesab bikin. Ew dikare daneyên nîv-sazkirî di forma cotên key-nirxê de hilîne.
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
Afirandina tabloyek li Cassandra pir dişibihe PostgreSQL. Yek ji cûdahiyên sereke nebûna astengiyên yekitiyê ye (mînak NE NULL), lê ev berpirsiyariya serîlêdanê ye, ne databasa NoSQL. Mifteya bingehîn ji mifteyek dabeşkirinê (di mînaka jêrîn de stûna Hunermend) û komek stûnên komkirinê (di mînaka jêrîn de stûna SongTitle) pêk tê. Bişkojka dabeşkirinê diyar dike ku rêz divê di kîjan dabeşkirinê/parçeyê de were danîn, û stûnên komkirinê destnîşan dikin ka dane çawa divê di hundurê perçeya heyî de were organîze kirin.
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 daneyan di nav databasan de birêxistin dike (Database) (mîna Keyspace li Cassandra), ku li wir Koleksiyonên (wek tabloyan) hene ku Belgeyên (wek rêzên di tabloyê de) dihewîne. Di MongoDB-ê de, di bingeh de ne hewce ye ku nexşeyek destpêkê diyar bike. Kom "Database bikar bînin", li jêr tê xuyang kirin, di banga yekem de databasê destnîşan dike û ji bo databasa ku nû hatî afirandin diguhezîne. Tewra berhevok jî ne hewce ye ku bi eşkereyî werin afirandin; ew bixweber têne afirandin, tenê gava ku hûn belgeya yekem li berhevokek nû zêde bikin. Têbînî ku MongoDB databasa testê ji hêla xwerû ve bikar tîne, ji ber vê yekê her operasyonek di asta berhevokê de bêyî destnîşankirina databasek taybetî dê li ser wê ji hêla xwerû ve were xebitandin.
use myNewDatabase;
Agahdariya li ser tabloyê digirin
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;
Ketina daneyan di tabloyekê de
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
Tevahiya îfade INSERT
li Cassandra pir dişibe ya PostgreSQL. Lêbelê, di semantîkê de cûdahiyek mezin heye. Li Cassandra INSERT
bi rastî operasyonek e UPSERT
, ku heke rêz jixwe hebe nirxên paşîn li rêzê têne zêdekirin.
Têketina daneyê mîna PostgreSQL ye
INSERT
mezintir
.
MongoDB
Her çend MongoDB databasek NoSQL wekî Cassandra ye, operasyona têketina wê bi tevgera semantîkî ya Cassandra re tiştek hevpar nîne. Li MongoDB UPSERT
, ku ew bi PostgreSQL re wekhev dike. Zêdekirina daneyên xwerû bêyî _idspecified
dê bibe sedem ku belgeyek nû li berhevokê were zêdekirin.
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"
}
}
);
Table Query
Dibe ku cûdahiya herî girîng a di navbera SQL û NoSQL de di warê avakirina pirsê de zimanê ku tê bikar anîn e FROM
и WHERE
. SQL piştî îfadeyê destûrê dide FROM
tabloyên piralî hilbijêre, û îfade bi WHERE
dikare ji her tevliheviyek be (tevlî operasyonan JOIN
di navbera maseyan de). Lêbelê, NoSQL meyla dike ku li ser sînorkirinek giran ferz bike FROM
, û tenê bi tabloyek diyarkirî re bixebitin, û tê de WHERE
, divê mifteya bingehîn her dem were diyar kirin. Ev bi pêla performansa NoSQL ve girêdide ku me berê qala wê kiribû. Ev xwestek rê li ber her kêmkirina gengaz di her danûstendina cross-tabular û cross-key de vedike. Ew dikare derengiyek mezin di danûstendina nav-nodê de gava ku bersivê dide daxwazekê destnîşan bike û ji ber vê yekê çêtirîn bi gelemperî tête dûr kirin. Mînakî, Cassandra hewce dike ku pirs ji hin operatoran re bêne sînorkirin (tenê =, IN, <, >, =>, <=
) li ser bişkokên dabeşkirinê, ji xeynî dema daxwazkirina navnîşek duyemîn (li vir tenê operator = destûr e).
PostgreSQL
Li jêr sê mînakên pirsan hene ku dikarin bi hêsanî ji hêla databasek SQL ve bêne darve kirin.
- Hemî stranên hunermendek nîşan bide;
- Hemî stranên hunermendê ku beşa yekem a sernavê li hev dikin nîşan bidin;
- Hemî stranên hunermendek ku di sernavê de peyvek diyar heye û bihayê wan ji 1.00 kêmtir e nîşan bidin.
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
Ji pirsên PostgreSQL yên ku li jor hatine navnîş kirin, tenê ya yekem dê li Cassandra neguhêrbar bixebite, ji ber ku operator LIKE
nikare ji bo komkirina stûnên wekî SongTitle
. Di vê rewşê de, tenê operator destûr in =
и 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
Wekî ku di mînakên berê de tê xuyang kirin, rêbaza sereke ji bo afirandina pirsan di MongoDB de ye music
di mînaka jêrîn de), ji ber vê yekê lêpirsîna gelek berhevokan qedexe ye.
db.music.find( {
artist: "No One You Know"
}
);
db.music.find( {
artist: "No One You Know",
songTitle: /Call/
}
);
Hemî rêzên tabloyê dixwînin
Xwendina hemî rêzan bi tenê rewşek taybetî ya şêwaza pirsê ye ku me berê lê nihêrî.
PostgreSQL
SELECT *
FROM Music;
Cassandra
Wek mînaka PostgreSQL ya jorîn.
MongoDB
db.music.find( {} );
Guhertina daneyan di tabloyekê de
PostgreSQL
PostgreSQL rêwerzan peyda dike UPDATE
ji bo guhertina daneyan. Derfetên wê tune UPSERT
, ji ber vê yekê heke rêz êdî di databasê de nebe ev gotin dê têk biçe.
UPDATE Music
SET Genre = 'Disco'
WHERE Artist = 'The Acme Band' AND SongTitle = 'Still In Love';
Cassandra
Cassandra heye UPDATE
mîna PostgreSQL. UPDATE
heman semantîk heye UPSERT
, wekhev INSERT
.
Wek mînaka PostgreSQL ya jorîn.
MongoDB
Operasyon UPSERT
. Nûvekirina gelek belgeyan û tevgerên wekhev UPSERT
dikare bi danîna alên zêde ji bo operasyonê were sepandin. Mînakî, di mînaka jêrîn de, celebê hunermendek taybetî li ser bingeha strana wî tê nûve kirin.
db.music.update(
{"artist": "The Acme Band"},
{
$set: {
"genre": "Disco"
}
},
{"multi": true, "upsert": true}
);
Rakirina daneyan ji tabloyê
PostgreSQL
DELETE FROM Music
WHERE Artist = 'The Acme Band' AND SongTitle = 'Look Out, World';
Cassandra
Wek mînaka PostgreSQL ya jorîn.
MongoDB
MongoDB du celeb operasyon hene ku belgeyan jêbirin -
db.music.deleteMany( {
artist: "The Acme Band"
}
);
Tabloyek jêbirin
PostgreSQL
DROP TABLE Music;
Cassandra
Wek mînaka PostgreSQL ya jorîn.
MongoDB
db.music.drop();
encamê
Nîqaşa di derbarê hilbijartina di navbera SQL û NoSQL de ji 10 salan zêdetir e ku diqewime. Du aliyên sereke yên vê nîqaşê hene: mîmariya motora databasê (yekdest, danûstendina SQL beramberî belavkirî, NoSQL ne-danûstandin) û nêzîkatiya sêwirana databasê (modelkirina daneya we di SQL beramberî modelkirina pirsên xwe di NoSQL de).
Digel databasek danûstendinê ya dabeşkirî ya mîna YugaByte DB, nîqaşa li ser mîmariya databasê bi hêsanî dikare were sekinandin. Ji ber ku cildên daneyê ji ya ku dikare li yek girêkek yekane were nivîsandin mezintir dibe, mîmariyek bi tevahî belavkirî ya ku bi parvekirina/hevsengkirina otomatîkî piştgirî dide pîvandina nivîsandina xêzkirî hewce dike.
Wekî din, wekî ku di yek ji gotaran de tê gotin
Em vegerin ser nîqaşa sêwirana databasê, rast e ku meriv bêje ku her du nêzîkatiyên sêwiranê (SQL û NoSQL) ji bo her serîlêdana cîhana rastîn a tevlihev hewce ne. Nêzîkatiya "modelkirina daneyê" ya SQL destûrê dide pêşdebiran ku bi hêsanî daxwazên karsaziyê yên guhezbar bicîh bînin, dema ku nêzîkatiya "modelkirina pirsê" ya NoSQL dihêle heman pêşdebiran li ser cildên mezin ên daneyê bi derengiya kêm û berbi zêde bixebitin. Ji ber vê sedemê ye ku YugaByte DB li şûna ku yek ji nêzîkatiyan pêşve bibe, API-yên SQL û NoSQL di bingehek hevpar de peyda dike. Wekî din, bi peydakirina lihevhatina bi zimanên databasên populer ên tevî PostgreSQL û Cassandra re, YugaByte DB piştrast dike ku pêşdebiran ne hewce ye ku zimanek din fêr bibin da ku bi motorek databasê ya belavbûyî, pir domdar re bixebitin.
Di vê gotarê de, me nihêrî ka bingehên sêwirana databasê di navbera PostgreSQL, Cassandra, û MongoDB de çawa cûda dibin. Di gotarên pêşerojê de, em ê li têgehên sêwirana pêşkeftî yên wekî index, danûstandin, JOIN, rêwerzên TTL, û belgeyên JSON bigerin.
Em dawiya hefteyê ji we re mayî dixwazin û we vedixwînin
Source: www.habr.com