Halo, réréncangan. Sateuacan angkat ka bagian kadua liburan Méi, kami bagikeun sareng anjeun bahan anu kami tarjamahkeun pikeun ngantisipasi peluncuran aliran énggal dina kursus.
Pamekar aplikasi nyéépkeun seueur waktos ngabandingkeun sababaraha pangkalan data operasional pikeun milih anu paling cocog sareng beban kerja anu dimaksud. Kabutuhan tiasa kalebet modél data anu disederhanakeun, jaminan transaksional, kinerja baca/tulis, skala horizontal, sareng kasabaran kasalahan. Sacara tradisional, pilihan dimimitian ku kategori database, SQL atanapi NoSQL, saprak unggal kategori presents susunan jelas trade-offs. Kinerja luhur dina hal latency lemah sareng throughput tinggi umumna dianggap sarat non-trade-off sahingga penting pikeun database sampel.
Tujuan artikel ieu pikeun mantuan pamekar aplikasi nyieun pilihan katuhu antara SQL jeung NoSQL dina konteks modeling data aplikasi. Urang bakal ningali hiji pangkalan data SQL, nyaéta PostgreSQL, sareng dua pangkalan data NoSQL, Cassandra sareng MongoDB, pikeun nutupan dasar-dasar desain database, sapertos ngadamel tabel, ngeusianana, maca data tina méja, sareng ngahapus. Dina artikel salajengna, urang pasti bakal ningali indéks, transaksi, JOIN, arahan TTL, sareng desain database basis JSON.
Naon bédana antara SQL sareng NoSQL?
Basis data SQL ningkatkeun kalenturan aplikasi ngaliwatan jaminan transaksional ACID, kitu ogé kamampuan pikeun naroskeun data nganggo JOINs ku cara anu teu disangka-sangka dina luhureun model database relational anu dinormalisasi.
Dibikeun arsitéktur monolithic / single-node sareng ngagunakeun modél réplikasi master-slave pikeun redundansi, database SQL tradisional kakurangan dua fitur penting - skalabilitas tulis linier (nyaéta partisi otomatis dina sababaraha titik) sareng leungitna data otomatis / nol. Ieu ngandung harti yén jumlah data narima teu bisa ngaleuwihan throughput nulis maksimum hiji titik tunggal. Salaku tambahan, sababaraha leungitna data samentawis kedah dipertimbangkeun dina kasabaran lepat (dina arsitéktur anu henteu dibagi). Di dieu anjeun kedah émut yén komitmen panganyarna henteu acan ditingali dina salinan budak. Pembaruan non-downtime ogé sesah dihontal dina database SQL.
database NoSQL biasana disebarkeun ku alam, i.e. di antarana, data dibagi kana bagian sarta disebarkeun sakuliah sababaraha titik. Aranjeunna peryogi denormalisasi. Ieu ngandung harti yén data diasupkeun ogé kudu disalin sababaraha kali pikeun ngabales requests husus Anjeun ngirim. Tujuan umum nyaéta pikeun ménta kinerja luhur ku cara ngurangan jumlah shards sadia salila dibaca. Ieu nunjukkeun yén NoSQL ngabutuhkeun anjeun pikeun ngamodelkeun patarosan anjeun, sedengkeun SQL ngabutuhkeun anjeun pikeun modél data anjeun.
NoSQL museurkeun kana ngahontal prestasi anu luhur dina klaster anu disebarkeun sareng ieu mangrupikeun alesan dasar pikeun seueur tradeoffs desain database anu kalebet rugi transaksi ACID, JOIN, sareng indéks sekundér global anu konsisten.
Aya argumen yén bari basis data NoSQL nyadiakeun scalability nulis linier jeung kasabaran sesar tinggi, leungitna jaminan transactional ngajadikeun eta teu cocog pikeun data misi-kritis.
Tabel di handap ieu nunjukkeun kumaha modél data dina NoSQL béda sareng SQL.
SQL sareng NoSQL: Naha duanana diperyogikeun?
Aplikasi dunya nyata sareng sajumlah ageung pangguna, sapertos Amazon.com, Netflix, Uber, sareng Airbnb, ditugaskeun pikeun ngalaksanakeun tugas anu kompleks sareng multifaceted. Contona, hiji aplikasi e-commerce kawas Amazon.com perlu nyimpen lightweight, data kritis tinggi kayaning informasi pamaké, produk, pesenan, invoices, babarengan jeung beurat, data kirang sénsitip kayaning ulasan produk, pesen rojongan , aktivitas pamaké, ulasan pamaké sarta saran. Alami, aplikasi ieu ngandelkeun sahanteuna hiji database SQL babarengan jeung sahanteuna hiji database NoSQL. Dina sistem cross-régional jeung global, database NoSQL beroperasi salaku cache-disebarkeun geo pikeun data nu disimpen dina sumber dipercaya database SQL ngajalankeun di wewengkon tunggal.
Kumaha YugaByte DB ngagabungkeun SQL sareng NoSQL?
Diwangun dina mesin panyimpen campuran anu berorientasi log, auto-sharding, réplikasi konsensus anu disebarkeun sharded sareng transaksi anu disebarkeun ACID (diideuan ku Google Spanner), YugaByte DB mangrupikeun database open source munggaran di dunya anu sakaligus cocog sareng NoSQL (Cassandra & Redis) sareng SQL (PostgreSQL). Ditémbongkeun saperti dina tabél di handap, YCQL, YugaByte DB API cocog sareng Cassandra, nambihan konsép tunggal jeung multi-konci transaksi ACID sarta indéks sekundér global kana API NoSQL, kukituna ushering dina jaman database NoSQL transactional. Salaku tambahan, YCQL, YugaByte DB API cocog sareng PostgreSQL, nambihan konsép skala tulis linier sareng kasabaran kasalahan otomatis kana API SQL, nyangking database SQL anu disebarkeun ka dunya. Kusabab YugaByte DB sifatna transaksional, API NoSQL ayeuna tiasa dianggo dina kontéks data kritis-misi.
Sakumaha didadarkeun saméméhna dina artikel
- Upami beban kerja utami anjeun nyaéta operasi JOIN multi-konci, teras nalika milih YSQL, ngartos yén konci anjeun tiasa disebarkeun ka sababaraha titik, nyababkeun latency anu langkung luhur sareng/atawa throughput anu langkung handap tibatan NoSQL.
- Upami teu kitu, pilih salah sahiji tina dua API NoSQL, émut yén anjeun bakal nampi prestasi anu langkung saé salaku hasil tina patarosan anu dilayanan tina hiji titik dina hiji waktos. YugaByte DB bisa ngawula salaku database operasional tunggal pikeun dunya nyata, aplikasi kompléks nu kudu ngatur sababaraha workloads sakaligus.
Laboratorium modeling Data dina bagian salajengna dumasar kana basis data DB YugaByte DB anu cocog sareng PostgreSQL sareng Cassandra API, sabalikna tina database asli. pendekatan ieu nekenkeun betah interacting jeung dua API béda (dina dua palabuhan béda) tina klaster database sarua, sabalikna ngagunakeun klaster lengkep bebas tina dua database béda.
Dina bagian handap, urang bakal nyandak katingal di lab modeling data pikeun ngagambarkeun béda jeung sababaraha commonalities tina database katutupan.
Laboratorium Modeling Data
Pamasangan database
Dibikeun tekenan kana desain modél data (tinimbang arsitéktur panyebaran kompleks), kami bakal masang pangkalan data dina wadah Docker dina mesin lokal teras berinteraksi sareng aranjeunna nganggo cangkang garis paréntah masing-masing.
PostgreSQL & Cassandra cocog database 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és garis paréntah
Hayu urang sambungkeun kana pangkalan data nganggo cangkang garis paréntah pikeun API anu saluyu.
PostgreSQL
docker exec -it yb-postgres-n1 /home/yugabyte/postgres/bin/psql -p 5433 -U postgres
Cassandra
cqlsh
dina katalog bin
.
Catet yén CQL diideuan ku SQL sareng gaduh konsép anu sami dina tabel, baris, kolom sareng indéks. Nanging, salaku basa NoSQL, éta nambihan sababaraha watesan anu tangtu, anu kalolobaanana ogé bakal dibahas dina tulisan anu sanés.
docker exec -it yb-tserver-n1 /home/yugabyte/bin/cqlsh
MongoDB
docker exec -it my-mongo bash
cd bin
mongo
Nyieun méja
Ayeuna urang tiasa berinteraksi sareng pangkalan data pikeun ngalakukeun sababaraha operasi nganggo garis paréntah. Hayu urang mimitian ku nyieun tabel nu nyimpen informasi ngeunaan lagu nu ditulis ku seniman béda. Lagu-lagu ieu tiasa janten bagian tina albeum. Ogé atribut pilihan pikeun lagu nyaéta taun release, harga, genre jeung rating. Urang kudu akun pikeun atribut tambahan nu bisa jadi diperlukeun dina mangsa nu bakal datang ngaliwatan widang "tag". Éta tiasa nyimpen data semi-terstruktur dina bentuk pasangan konci-nilai.
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
Nyiptakeun méja di Cassandra sami sareng PostgreSQL. Salah sahiji bédana utama nyaéta kurangna konstrain integritas (misalna NOT NULL), tapi ieu mangrupikeun tanggung jawab aplikasi, sanés database NoSQL.. Konci primér diwangun ku hiji konci partisi (kolom Artist dina conto di handap) jeung sakumpulan kolom clustering (kolom SongTitle dina conto di handap). Tombol partisi nangtukeun mana partisi / beling baris kudu disimpen kana, sarta kolom clustering nunjukkeun kumaha data kudu diatur dina beling ayeuna.
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 ngatur data kana basis data (Database) (sarupa jeung Keyspace di Cassandra), dimana aya Koléksi (sarupa tabel) nu ngandung Dokumén (sarupa baris dina méja). Dina MongoDB, dasarna henteu kedah nangtukeun skéma awal. Tim "nganggo database", ditémbongkeun di handap, instantiates database dina panggero munggaran tur ngarobah konteks pikeun database karek dijieun. Malah koléksi henteu kedah didamel sacara eksplisit; aranjeunna didamel sacara otomatis, ngan saukur nalika anjeun nambihan dokumén anu munggaran kana koleksi énggal. Catet yén MongoDB nganggo pangkalan data tés sacara standar, ku kituna sagala operasi tingkat kempelan tanpa nangtukeun database khusus bakal dijalankeun sacara standar.
use myNewDatabase;
Kéngingkeun inpormasi ngeunaan méja
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;
Ngasupkeun data kana tabél
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
Gemblengna éksprési INSERT
dina Cassandra Sigana pisan sarupa nu di PostgreSQL. Sanajan kitu, aya hiji bédana badag dina semantik. Dina Cassandra INSERT
sabenerna mangrupa operasi UPSERT
, dimana nilai panungtungan ditambahkeun kana baris lamun baris geus aya.
Éntri data sami sareng PostgreSQL
INSERT
luhur
.
MongoDB
Sanaos MongoDB mangrupikeun pangkalan data NoSQL sapertos Cassandra, operasi sisipanna teu aya anu sami sareng paripolah semantis Cassandra. Dina MongoDB UPSERT
, nu ngajadikeun eta sarupa PostgreSQL. Nambahkeun data standar tanpa _idspecified
bakal ngabalukarkeun hiji dokumen anyar ditambahkeun kana koleksi.
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"
}
}
);
Méja Query
Panginten bédana anu paling signifikan antara SQL sareng NoSQL dina hal konstruksi query nyaéta basa anu dianggo FROM
и WHERE
. SQL ngamungkinkeun sanggeus éksprési FROM
pilih sababaraha tabel, sarta ekspresi kalawan WHERE
tiasa tina sagala pajeulitna (kaasup operasi JOIN
antara tabél). Nanging, NoSQL condong maksakeun watesan anu parah FROM
, sarta ngan dianggo kalayan hiji méja dieusian, sarta di WHERE
, konci primér kudu salawasna dieusian. Ieu hubungan kana dorongan kinerja NoSQL anu urang bahas tadi. Kahayang ieu nyababkeun unggal pangurangan kamungkinan dina sagala interaksi cross-tabular sareng cross-key. Éta tiasa ngenalkeun reureuh anu ageung dina komunikasi antar-titik nalika ngaréspon kana pamundut sareng ku kituna paling dihindari sacara umum. Salaku conto, Cassandra meryogikeun patarosan dugi ka operator anu tangtu (ngan =, IN, <, >, =>, <=
) dina kenop partisi, iwal mun menta indéks sekundér (ngan operator = nu diwenangkeun dieu).
PostgreSQL
Di handap ieu aya tilu conto queries nu bisa kalayan gampang dieksekusi ku database SQL.
- Pintonan sadaya lagu ku artis;
- Tampilkeun sadaya lagu ku artis anu cocog sareng bagian kahiji judulna;
- Nampilkeun sadaya lagu ku artis anu ngagaduhan kecap anu tangtu dina judulna sareng hargana kirang ti 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
Tina patarosan PostgreSQL anu didaptarkeun di luhur, ngan anu pangheulana bakal tiasa dianggo dina Cassandra, sabab operator LIKE
teu bisa dilarapkeun ka clustering kolom kayaning SongTitle
. Dina hal ieu, ngan operator nu diwenangkeun =
и 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
Ditémbongkeun saperti dina conto saméméhna, métode utama pikeun nyieun queries di MongoDB nyaeta music
dina conto di handap), jadi querying sababaraha kumpulan dilarang.
db.music.find( {
artist: "No One You Know"
}
);
db.music.find( {
artist: "No One You Know",
songTitle: /Call/
}
);
Maca sadaya jajar méja
Maca sadaya baris mangrupikeun kasus khusus tina pola pamundut anu urang tingali sateuacana.
PostgreSQL
SELECT *
FROM Music;
Cassandra
Sarupa jeung conto PostgreSQL di luhur.
MongoDB
db.music.find( {} );
Ngédit data dina tabél
PostgreSQL
PostgreSQL nyadiakeun parentah UPDATE
pikeun ngarobah data. Manehna teu boga kasempetan UPSERT
, jadi pernyataan ieu bakal gagal lamun baris geus euweuh dina database.
UPDATE Music
SET Genre = 'Disco'
WHERE Artist = 'The Acme Band' AND SongTitle = 'Still In Love';
Cassandra
Cassandra boga UPDATE
sarupa PostgreSQL. UPDATE
ngabogaan semantik sarua UPSERT
, sarupa INSERT
.
Sarupa jeung conto PostgreSQL di luhur.
MongoDB
Operasi UPSERT
. Ngamutahirkeun sababaraha dokumén sareng kabiasaan anu sami UPSERT
bisa diterapkeun ku nyetel bandéra tambahan pikeun operasi. Contona, dina conto di handap, genre artis husus diropéa dumasar kana lagu na.
db.music.update(
{"artist": "The Acme Band"},
{
$set: {
"genre": "Disco"
}
},
{"multi": true, "upsert": true}
);
Nyoplokkeun data tina méja
PostgreSQL
DELETE FROM Music
WHERE Artist = 'The Acme Band' AND SongTitle = 'Look Out, World';
Cassandra
Sarupa jeung conto PostgreSQL di luhur.
MongoDB
MongoDB ngagaduhan dua jinis operasi pikeun ngahapus dokumén -
db.music.deleteMany( {
artist: "The Acme Band"
}
);
Mupus méja
PostgreSQL
DROP TABLE Music;
Cassandra
Sarupa jeung conto PostgreSQL di luhur.
MongoDB
db.music.drop();
kacindekan
Perdebatan ngeunaan milih antara SQL sareng NoSQL parantos ngamuk langkung ti 10 taun. Aya dua aspék utama pikeun debat ieu: arsitektur mesin database (monolithic, transactional SQL vs disebarkeun, non-transactional NoSQL) jeung pendekatan desain database (modeling data anjeun dina SQL vs modeling queries anjeun dina NoSQL).
Kalawan database transactional disebarkeun kawas YugaByte DB, debat ngeunaan arsitektur database bisa gampang ditunda. Salaku volume data jadi leuwih badag batan naon bisa ditulis kana hiji titik tunggal, a arsitéktur disebarkeun pinuh nu ngarojong scalability linear nulis kalawan sharding otomatis / rebalancing jadi diperlukeun.
Sajaba ti éta, sakumaha disebutkeun dina salah sahiji artikel
Balik deui ka sawala desain database, éta adil disebutkeun yen duanana pendekatan desain (SQL jeung NoSQL) anu diperlukeun pikeun sagala aplikasi real-dunya kompléks. Pendekatan "modeling data" SQL ngamungkinkeun pamekar langkung gampang nyumponan syarat bisnis anu robih, sedengkeun pendekatan "modeling query" NoSQL ngamungkinkeun para pamekar anu sami tiasa beroperasi dina volume data anu ageung kalayan latency rendah sareng throughput anu luhur. Ku sabab kitu YugaByte DB nyayogikeun SQL sareng NoSQL API dina inti umum, tinimbang promosi salah sahiji pendekatan. Salaku tambahan, ku nyayogikeun kasaluyuan sareng basa pangkalan data populér kalebet PostgreSQL sareng Cassandra, YugaByte DB mastikeun yén pamekar henteu kedah diajar basa sanés pikeun damel sareng mesin database anu disebarkeun, konsisten pisan.
Dina tulisan ieu, urang ningali kumaha dasar desain database béda antara PostgreSQL, Cassandra, sareng MongoDB. Dina artikel kahareup, urang bakal teuleum kana konsép desain canggih sapertos indéks, transaksi, JOINs, diréktif TTL, sarta dokumén JSON.
Keukeuh we anjeun sésana hébat sabtu minggu jeung ngajak anjeun ka
sumber: www.habr.com