Mhoro shamwari. Tisati taenda kuchikamu chechipiri chezororo raChivabvu, tinogovana nemi zvinyorwa zvatakashandura tichitarisira kutangwa kwerukova rutsva pachikoro.
Vagadziri vezvishandiso vanopedza nguva yakawanda vachienzanisa akawanda ekushandisa dhatabhesi kuti vasarudze iyo inonyatsoenderana nebasa rakatarisirwa. Zvinodiwa zvinogona kusanganisira kurerutsa data modelling, transactional guarantees, kuverenga/kunyora kuita, horizontal scaling, uye kukanganisa kushivirira. Sechivanhu, sarudzo inotanga nechikamu chedhatabhesi, SQL kana NoSQL, sezvo chikamu chega chega chinopa seti yakajeka yekutengeserana-offs. Kushanda kwepamusoro maererano ne low latency uye kukwirira kwepamusoro kunowanzoonekwa sechinhu chisingaiti chekutengesa uye naizvozvo chakakosha kune chero sampuli database.
Chinangwa chechinyorwa chino ndechekubatsira vanogadzira maapplication kuita sarudzo chaiyo pakati peSQL neNoSQL mumamiriro ekushandisa data modelling. Tichatarisa pane imwe SQL dhatabhesi, inoti PostgreSQL, uye maviri NoSQL dhatabhesi, Cassandra neMongoDB, kuvhara izvo zvekutanga zvedhizaini dhizaini, sekugadzira matafura, kuaisa, kuverenga data kubva patafura, uye kuidzima. Muchinyorwa chinotevera, isu tichave nechokwadi chekutarisa indexes, transactions, JOINs, TTL dhairekitori, uye JSON-based database dhizaini.
Ndeupi musiyano uripo pakati peSQL neNoSQL?
SQL dhatabhesi inowedzera kuchinjika kwekushandisa kuburikidza neACID transactional garanti, pamwe nekugona kwavo kubvunza data vachishandisa maJOIN nenzira dzisingatarisirwe pamusoro peiyo iripo yakajairwa relational database modhi.
Tichipihwa yavo monolithic/single-node architecture uye kushandiswa kwe master-slave replication model for redundancy, zvechinyakare SQL dhatabhesi inoshaya maviri akakosha maficha - linear kunyora scalability (kureva otomatiki partitioning munzvimbo dzakawanda) uye otomatiki / zero kurasikirwa kwedata. Izvi zvinoreva kuti huwandu hwe data yakagamuchirwa haigoni kudarika huwandu hwekunyora kwekunyora kwenode imwe chete. Uye zvakare, kumwe kurasikirwa kwe data kwenguva pfupi kunofanirwa kuverengerwa mukutadza kushivirira (mune yakagovaniswa-hapana chivakwa chekuvaka). Pano iwe unofanirwa kuyeuka kuti zvichangobva kuitwa hazvisati zvaratidzwa mukopi yevaranda. Non-downtime updates zvakare yakaoma kuwana muSQL dhatabhesi.
NoSQL dhatabhesi anowanzo kugovaniswa nemasikirwo, i.e. mavari, data rakakamurwa kuita zvikamu uye rakagovaniswa munzvimbo dzakawanda. Vanoda denormalization. Izvi zvinoreva kuti data rakaiswa rinofanirwawo kukopwa kakawanda kuti upindure kune chaiwo zvikumbiro zvaunotumira. Chinangwa chakazara ndechekuwana kuita kwepamusoro nekudzikisa huwandu hwemashadhi anowanikwa panguva yekuverenga. Izvi zvinoreva kuti NoSQL inoda kuti uenzanise mibvunzo yako, nepo SQL ichida kuti uenzanise data rako.
NoSQL inotarisa pakuwana kuita kwepamusoro musumbu rakagoverwa uye ichi ndicho chikonzero chevakawanda dhizaini dhizaini yekutengesa iyo inosanganisira ACID transaction kurasikirwa, JOINs, uye inowirirana yepasirese yechipiri indexes.
Pane gakava rekuti nepo NoSQL dhatabhesi inopa mutsara kunyora scalability uye yakanyanya kukanganisa kushivirira, kurasikirwa kwezvivimbiso zvekutengeserana kunoita kuti dzisakodzere dhata-yakakosha data.
Tafura inotevera inoratidza kuti data modelling muNoSQL inosiyana sei neSQL.
SQL uye NoSQL: Nei zvese zvichidikanwa?
Zvishandiso zvepasi rese zvine nhamba huru yevashandisi, seAmazon.com, Netflix, Uber, uye Airbnb, vane basa rekuita mabasa akaomarara, ane mativi mazhinji. Semuenzaniso, e-commerce application senge Amazon.com inoda kuchengetedza yakareruka, yakakwirira-yakakosha data senge ruzivo rwemushandisi, zvigadzirwa, maodha, mainvoice, pamwe neinorema, isinganyanyi kunzwisiswa data senge ongororo yechigadzirwa, mameseji ekutsigira, chiitiko chemushandisi, ongororo yevashandisi uye kurudziro. Sezvingatarisirwa, izvi zvikumbiro zvinotsamira pane imwechete SQL dhatabhesi pamwe neinokwana imwe NoSQL dhatabhesi. Muchinjika-regional uye yepasi rose masisitimu, dhatabhesi reNoSQL rinoshanda segeo-yakagoverwa cache yedata rakachengetwa mune yakavimbika sosi SQL dhatabhesi inomhanya munharaunda imwe chete.
YugaByte DB inosanganisa sei SQL neNoSQL?
Yakavakirwa pane yelogi-yakatarisana yakasanganiswa yekuchengetera injini, auto-sharding, sharded yakagovaniswa kubvumirana kudzokororwa uye ACID yakagoverwa transaction (yakafuridzirwa neGoogle Spanner), YugaByte DB ndiyo yekutanga yakavhurika sosi dhatabhesi pasi rose inoenderana panguva imwe chete neNoSQL (Cassandra & Redis) uye SQL (PostgreSQL). Sezvinoratidzwa patafura iri pazasi, YCQL, iyo YugaByte DB API inoenderana neCassandra, inowedzera pfungwa dzeimwe uye yakawanda-kiyi ACID transaction uye epasi rose yechipiri indexes kuNoSQL API, nekudaro ichipinza munguva yekutengeserana NoSQL dhatabhesi. Pamusoro pezvo, YCQL, iyo YugaByte DB API inoenderana nePostgreSQL, inowedzera pfungwa dzemutsara wekunyora kuyera uye otomatiki kukanganisa kushivirira kuSQL API, ichiunza yakagoverwa SQL dhatabhesi kupasi. Nekuti YugaByte DB iri transactional muzvisikwa, iyo NoSQL API inogona kushandiswa mumamiriro eiyo mission-yakakosha data.
Sezvambotaurwa munyaya yacho
- Kana basa rako rekutanga riri ma-multi-kiyi JOIN mashandiro, saka kana uchisarudza YSQL, nzwisisa kuti makiyi ako anogona kugovaniswa munzvimbo dzakawanda, zvichikonzera latency yepamusoro uye/kana kuderera kwekupinda kupfuura NoSQL.
- Zvikasadaro, sarudza chero maviri eNoSQL APIs, uchifunga kuti iwe unowana kuita zvirinani semhedzisiro yemibvunzo inopihwa kubva kune imwe node panguva. YugaByte DB inogona kushanda sedhatabhesi rekushandisa renyika chaiyo, yakaoma maapplication inoda kubata akawanda mabasa panguva imwe chete.
Iyo Data modelling lab muchikamu chinotevera yakavakirwa paPostgreSQL uye Cassandra API inoenderana neYugaByte DB dhatabhesi, kupesana nemadhatabhesi ekuzvarwa. Iyi nzira inosimbisa kusununguka kwekubatana nema API maviri akasiyana (pazviteshi zviviri zvakasiyana) zveboka rimwe chete re database, kusiyana nekushandisa zvikwata zvakasununguka zvakakwana zvezvinyorwa zviviri zvakasiyana.
Muzvikamu zvinotevera, isu tichatarisa kune data modelling lab kuratidza mutsauko uye zvimwe zvezvakajairwa zvedhatabhesi zvakafukidzwa.
Data Modelling Laboratory
Database installation
Tichifunga nezve kusimbiswa kwedhizaini yedhizaini (panzvimbo peakaomesesa ekuisa zvivakwa), isu tichaisa dhatabhesi mumidziyo yeDocker pamushini wemuno tobva tapindirana navo tichishandisa mitsara yavo yekuraira.
PostgreSQL & Cassandra inoenderana neYugaByte DB dhatabhesi
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
Raira mutsara kuwana
Ngatibatanei kune dhatabhesi tichishandisa mutsara wemirairo shell yeanoenderana APIs.
PostgreSQL
docker exec -it yb-postgres-n1 /home/yugabyte/postgres/bin/psql -p 5433 -U postgres
Cassandra
cqlsh
mubhuku bin
.
Ziva kuti CQL yakafuridzirwa neSQL uye ine pfungwa dzakafanana dzematafura, mitsara, makoramu uye indexes. Nekudaro, semutauro weNoSQL, inowedzera imwe seti yezvipimo, mazhinji acho isu tichavharawo mune zvimwe zvinyorwa.
docker exec -it yb-tserver-n1 /home/yugabyte/bin/cqlsh
MongoDB
docker exec -it my-mongo bash
cd bin
mongo
Kugadzira tafura
Iye zvino tinogona kupindirana nedhatabhesi kuita mashandiro akasiyana siyana tichishandisa mutsara wekuraira. Ngatitange nekugadzira tafura inochengeta ruzivo rwenziyo dzakanyorwa nevanyori vakasiyana. Nziyo idzi dzinogona kunge dziri chikamu chealbum. Zvakare maitiro akasarudzika erwiyo igore rekuburitswa, mutengo, rudzi uye kuyerwa. Isu tinofanirwa kuzvidavirira kune humwe hunhu hungazodikanwa mune ramangwana kuburikidza ne "tags" ndima. Inogona kuchengeta semi-yakaumbwa data muchimiro chekiyi-kukosha mapeya.
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
Kugadzira tafura muCassandra kwakafanana nePostgreSQL. Mumwe wemisiyano mikuru ndeyekushaikwa kwezvirambidzo zvekuvimbika (semuenzaniso NOT NULL), asi iri ibasa rekushandisa, kwete iyo NoSQL dhatabhesi.. Kiyi yekutanga ine kiyi yekuparadzanisa (iyo Artist column mumuenzaniso pazasi) uye seti yemakoramu ekubatanidza (iyo SongTitle column mumuenzaniso uri pazasi). Kiyi yekuparadzanisa inosarudza kuti ndeipi chikamu / shard mutsara unofanirwa kuiswa mukati, uye makoramu ekubatanidza anoratidza kuti data rinofanira kurongeka sei mukati meiyo shard yazvino.
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 inoronga data kuita dhatabhesi (Database) (yakafanana neKeyspace muCassandra), uko kune Maunganidzwa (akafanana nematafura) ane Zvinyorwa (zvakafanana nemitsara mutafura). MuMongoDB, hapana chikonzero chekutsanangura yekutanga schema. Team "shandisa database", inoratidzwa pazasi, inosimbisa dhatabhesi pane yekutanga kufona uye inoshandura mamiriro eiyo ichangobva kugadzirwa database. Kunyangwe kuunganidzwa hakudi kugadzirwa zvakajeka; ivo vanogadzirwa otomatiki, kana iwe uchinge wawedzera gwaro rekutanga muunganidzwa mutsva. Ziva kuti MongoDB inoshandisa dhatabhesi yekuyedza nekukasira, saka chero basa rekuunganidza-level pasina kutsanangura dhatabhesi chaiyo inomhanya pairi nekukasira.
use myNewDatabase;
Kuwana ruzivo nezve tafura
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;
Kupinza data mutafura
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
Kutaura kwese INSERT
muCassandra inotaridzika zvakafanana neiyo muPostgreSQL. Nekudaro, pane musiyano mukuru musemantics. MuCassandra INSERT
kuvhiya chaiko UPSERT
, uko hunhu hwekupedzisira hunowedzerwa kumutsara kana mutsara watovepo.
Kupinda kwedata kwakafanana nePostgreSQL
INSERT
yepamusorosoro
.
MongoDB
Kunyangwe MongoDB iri dhatabhesi reNoSQL seCassandra, kushanda kwayo kwekuisa hakuna chinhu chakafanana nehunhu hwesemantic hweCassandra. MuMongoDB UPSERT
, izvo zvinoita kuti ive yakafanana nePostgreSQL. Kuwedzera default data pasina _idspecified
ichaita kuti gwaro idzva riwedzerwe kuunganidzwa.
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"
}
}
);
Tafura Mubvunzo
Zvichida musiyano wakanyanya kukosha pakati peSQL neNoSQL maererano nekuvakwa kwemubvunzo ndiwo mutauro unoshandiswa FROM
ΠΈ WHERE
. SQL inobvumira mushure mekutaura FROM
sarudza matafura akawanda, uye kutaura ne WHERE
inogona kuve yechero yakaoma (kusanganisira mashandiro JOIN
pakati pematafura). Nekudaro, NoSQL inoda kuisa muganho wakakomba pa FROM
, uye shanda chete netafura imwe yakatarwa, uye mukati WHERE
, kiyi yekutanga inofanira kugara ichitsanangurwa. Izvi zvinosungirirana neNoSQL performance push yatakataura nezvayo kare. Ichi chishuwo chinotungamira kune yega yega inogona kudzikiswa mune chero muchinjiko-tabular uye muchinjiko-kiyi kupindirana. Inogona kuunza kunonoka kukuru mukukurukurirana kwe-inter-node kana ichipindura chikumbiro uye saka inodzivirirwa zvakanyanya. Semuenzaniso, Cassandra inoda kuti mibvunzo igumirwe kune vamwe vashandisi (chete =, IN, <, >, =>, <=
) pamakiyi ekuparadzanisa, kunze kwekunge uchikumbira yechipiri index (chete = mushandisi anotenderwa pano).
PostgreSQL
Pazasi pane mienzaniso mitatu yemibvunzo inogona kuitwa nyore neSQL database.
- Ratidza nziyo dzese nemuimbi;
- Ratidza nziyo dzese dzemuimbi dzinoenderana nechikamu chekutanga chezita;
- Ratidza nziyo dzese nemuimbi ane rimwe izwi mumusoro uye ane mutengo uri pasi pe1.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
Pamibvunzo yePostgreSQL yakanyorwa pamusoro, yekutanga chete ndiyo inoshanda isina kuchinjwa muCassandra, sezvo mushandisi. LIKE
haigone kushandiswa kumakoramu ekuunganidza akadai SongTitle
. Muchiitiko ichi, vashandi chete vanobvumirwa =
ΠΈ 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
Sezvinoratidzwa mumienzaniso yapfuura, nzira huru yekugadzira mibvunzo muMongoDB ndeye music
mumuenzaniso uri pazasi), saka kubvunza kuunganidzwa kwakawanda kunorambidzwa.
db.music.find( {
artist: "No One You Know"
}
);
db.music.find( {
artist: "No One You Know",
songTitle: /Call/
}
);
Kuverenga mitsetse yese yetafura
Kuverenga mitsetse yese ingori nyaya yakakosha yemuenzaniso webvunzo watakambotarisa pakutanga.
PostgreSQL
SELECT *
FROM Music;
Cassandra
Zvakafanana neiyo PostgreSQL muenzaniso pamusoro.
MongoDB
db.music.find( {} );
Kugadzirisa data mutafura
PostgreSQL
PostgreSQL inopa mirairo UPDATE
kuchinja data. Haana mikana UPSERT
, saka chirevo ichi chichakundikana kana mutsara usisiri mu database.
UPDATE Music
SET Genre = 'Disco'
WHERE Artist = 'The Acme Band' AND SongTitle = 'Still In Love';
Cassandra
Cassandra ane UPDATE
zvakafanana nePostgreSQL. UPDATE
ine semantics yakafanana UPSERT
, zvakafanana INSERT
.
Zvakafanana neiyo PostgreSQL muenzaniso pamusoro.
MongoDB
Kushanda UPSERT
. Kuvandudza magwaro akawanda uye maitiro akafanana UPSERT
inogona kushandiswa nekuisa mamwe mareza ekushanda. Semuenzaniso, mumuenzaniso uri pasi apa, rudzi rweimwe nyanzvi inovandudzwa zvichienderana nerwiyo rwake.
db.music.update(
{"artist": "The Acme Band"},
{
$set: {
"genre": "Disco"
}
},
{"multi": true, "upsert": true}
);
Kubvisa data kubva patafura
PostgreSQL
DELETE FROM Music
WHERE Artist = 'The Acme Band' AND SongTitle = 'Look Out, World';
Cassandra
Zvakafanana neiyo PostgreSQL muenzaniso pamusoro.
MongoDB
MongoDB ine marudzi maviri emashandiro ekudzima magwaro -
db.music.deleteMany( {
artist: "The Acme Band"
}
);
Kudzima tafura
PostgreSQL
DROP TABLE Music;
Cassandra
Zvakafanana neiyo PostgreSQL muenzaniso pamusoro.
MongoDB
db.music.drop();
mhedziso
Gakava rekusarudza pakati peSQL neNoSQL rave richipisa kwemakore anopfuura gumi. Pane zvinhu zviviri zvakakosha zvegakava iri: dhatabhesi injini yekuvaka (monolithic, transactional SQL vs yakagoverwa, isiri-transactional NoSQL) uye dhizaini dhizaini nzira (kuenzanisira data rako muSQL vs kuenzanisira mibvunzo yako muNoSQL).
Iine yakagoverwa transaction dhatabhesi seYugaByte DB, gakava pamusoro pedhizaini rekuvaka rinogona kuiswa nyore nyore. Sezvo mavhoriyamu edata achikura kupfuura izvo zvinogona kunyorwa kune imwechete node, chivakwa chakaparadzirwa zvizere chinotsigira mutsara wekunyora scalability neatomatiki sharding / kuenzanisa zvakare inove yakakosha.
Kunze kwezvo, sezvakataurwa mune chimwe chezvinyorwa
Kudzoka kuhurukuro yekugadzira dhatabhesi, zvine musoro kutaura kuti nzira dzese dzekugadzira (SQL neNoSQL) dzinodikanwa kune chero yakaoma-chaiyo-yepasirese application. Iyo SQL "data modeling" nzira inobvumira vanogadzira kuti vasangane nyore nyore nekuchinja kwebhizinesi zvinodiwa, nepo NoSQL "query modeling" nzira inobvumira vagadziri vakafanana kuti vashande pamavhoriyamu makuru edata ine yakaderera latency uye yakakwirira throughput. Ndicho chikonzero nei YugaByte DB inopa SQL uye NoSQL APIs mune yakajairwa musimboti, pane kusimudzira imwe yenzira. Pamusoro pezvo, nekupa kuenderana nemitauro yakakurumbira yedhatabhesi inosanganisira PostgreSQL neCassandra, YugaByte DB inova nechokwadi chekuti vanogadzira havafanirwe kudzidza mumwe mutauro kushanda neinjini yakagoverwa, inowirirana zvakanyanya.
Muchikamu chino, takatarisa kuti dhizaini yedhizaini inosiyana sei pakati pePostgreSQL, Cassandra, uye MongoDB. Muzvinyorwa zvichauya, tichanyura mune zvemhando yepamusoro dhizaini senge indexes, transactions, JOINs, TTL dhairekitori, uye JSON zvinyorwa.
Tinokushuvirai zororo rakanaka rekupera kwesvondo uye tinokukokai
Source: www.habr.com