Dasar Desain Database - Ngabandingkeun PostgreSQL, Cassandra, sareng MongoDB

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. "DBMS Relasional".

Dasar Desain Database - Ngabandingkeun PostgreSQL, Cassandra, sareng MongoDB

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.

Dasar Desain Database - Ngabandingkeun PostgreSQL, Cassandra, sareng MongoDB

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.

Dasar Desain Database - Ngabandingkeun PostgreSQL, Cassandra, sareng MongoDB

Sakumaha didadarkeun saméméhna dina artikel "Ngawanohkeun YSQL: A PostgreSQL Compatible Distributed SQL API pikeun YugaByte DB", pilihan antara SQL atanapi NoSQL dina YugaByte DB gumantung sagemblengna kana karakteristik beban kerja dasar:

  • 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

psql nyaéta cangkang baris paréntah pikeun berinteraksi sareng PostgreSQL. Pikeun betah pamakéan, YugaByte DB hadir kalawan psql katuhu dina folder bin.

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

Cassandra

cqlsh nyaéta cangkang garis paréntah pikeun berinteraksi sareng Cassandra sareng pangkalan data anu cocog sareng CQL (Cassandra Query Language). Pikeun betah pamakéan, YugaByte DB hadir kalawan 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

mongo nyaéta cangkang baris paréntah pikeun berinteraksi sareng MongoDB. Éta tiasa dipendakan dina diréktori bin pamasangan 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 lebetkeun () teu boga kasempetan 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 db.collection.find(). Metoda ieu sacara eksplisit ngandung nami koleksi (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 update () dina MongoDB tiasa lengkep ngamutahirkeun dokumen anu tos aya atanapi ngan ukur ngapdet widang anu tangtu. Sacara standar, éta ngan ngamutahirkeun hiji dokumén kalayan semantik ditumpurkeun 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 - deleteOne() /deleteMany() и ngaleupaskeun (). Duanana jenis ngahapus dokumén tapi balik hasil béda.

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 Google awan, Arsitéktur Transactional, konsisten pisan ayeuna leuwih , dipaké pikeun nyadiakeun agility ngembangkeun hadé ti non-transactional, , arsitéktur ahirna konsisten.

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 bebas webinar, anu bakal lumangsung dina 14 Méi.

sumber: www.habr.com

Tambahkeun komentar