Ma'lumotlar bazasini loyihalash asoslari - PostgreSQL, Cassandra va MongoDB ni solishtirish

Salom, do'stlar. May bayramlarining ikkinchi qismiga jo'nashdan oldin, kursda yangi oqim boshlanishini kutgan holda tarjima qilgan materialimizni siz bilan baham ko'ramiz. "Relational DBMS".

Ma'lumotlar bazasini loyihalash asoslari - PostgreSQL, Cassandra va MongoDB ni solishtirish

Ilova ishlab chiquvchilari mo'ljallangan ish yukiga eng mos keladiganini tanlash uchun bir nechta operatsion ma'lumotlar bazalarini solishtirishga ko'p vaqt sarflashadi. Ehtiyojlar soddalashtirilgan ma'lumotlarni modellashtirish, tranzaksiya kafolatlari, o'qish/yozish unumdorligi, gorizontal masshtablash va xatolarga chidamlilikni o'z ichiga olishi mumkin. An'anaga ko'ra, tanlov ma'lumotlar bazasi toifasi, SQL yoki NoSQL bilan boshlanadi, chunki har bir toifada aniq o'zaro kelishuvlar mavjud. Past kechikish va yuqori o'tkazuvchanlik nuqtai nazaridan yuqori mahsuldorlik odatda sotuvga qo'yilmaydigan talab sifatida ko'riladi va shuning uchun har qanday namunaviy ma'lumotlar bazasi uchun zarurdir.

Ushbu maqolaning maqsadi dastur ishlab chiquvchilarga dastur ma'lumotlarini modellashtirish kontekstida SQL va NoSQL o'rtasida to'g'ri tanlov qilishga yordam berishdir. Jadvallarni yaratish, ularni to'ldirish, jadvaldan ma'lumotlarni o'qish va uni o'chirish kabi ma'lumotlar bazasini loyihalash asoslarini qamrab olish uchun biz bitta SQL ma'lumotlar bazasini, ya'ni PostgreSQLni va ikkita NoSQL ma'lumotlar bazasini, Cassandra va MongoDBni ko'rib chiqamiz. Keyingi maqolada biz indekslar, tranzaksiyalar, JOINlar, TTL direktivalari va JSON-ga asoslangan ma'lumotlar bazasi dizaynini ko'rib chiqamiz.

SQL va NoSQL o'rtasidagi farq nima?

SQL ma'lumotlar bazalari ACID tranzaksiya kafolatlari orqali dastur moslashuvchanligini oshiradi, shuningdek, mavjud normallashtirilgan relyatsion ma'lumotlar bazasi modellari ustiga kutilmagan usullarda JOINlar yordamida ma'lumotlarni so'rash qobiliyatini oshiradi.

Ularning monolit/bitta tugunli arxitekturasi va zaxiralash uchun master-slave replikatsiya modelidan foydalanishni hisobga olgan holda, an'anaviy SQL ma'lumotlar bazalarida ikkita muhim xususiyat mavjud emas - chiziqli yozish miqyosi (ya'ni, bir nechta tugunlar bo'ylab avtomatik bo'linish) va avtomatik/nol ma'lumotlarni yo'qotish. Bu shuni anglatadiki, olingan ma'lumotlar miqdori bitta tugunning maksimal yozish qobiliyatidan oshmasligi kerak. Bunga qo'shimcha ravishda, ba'zi vaqtinchalik ma'lumotlar yo'qotilishi xatolarga chidamlilikda (birgalikda hech narsa bo'lmagan arxitekturada) hisobga olinishi kerak. Bu erda shuni yodda tutish kerakki, yaqinda qilingan majburiyatlar hali ham qul nusxasida aks ettirilmagan. SQL ma'lumotlar bazalarida uzilishsiz yangilanishlarga erishish ham qiyin.

NoSQL ma'lumotlar bazalari odatda tabiatan taqsimlanadi, ya'ni. ularda ma'lumotlar bo'limlarga bo'linadi va bir nechta tugunlar bo'ylab taqsimlanadi. Ular denormalizatsiyani talab qiladi. Bu siz yuborgan maxsus so'rovlarga javob berish uchun kiritilgan ma'lumotlar ham bir necha marta ko'chirilishi kerakligini anglatadi. Umumiy maqsad - o'qish paytida mavjud bo'lgan parchalar sonini kamaytirish orqali yuqori samaradorlikka erishish. Bu shuni anglatadiki, NoSQL so'rovlaringizni modellashtirishni talab qiladi, SQL esa ma'lumotlaringizni modellashtirishni talab qiladi.

NoSQL taqsimlangan klasterda yuqori samaradorlikka erishishga qaratilgan va bu ACID tranzaksiyalarini yo'qotish, JOINlar va izchil global ikkilamchi indekslarni o'z ichiga olgan ko'plab ma'lumotlar bazasini loyihalashning asosiy asosidir.

NoSQL ma'lumotlar bazalari chiziqli yozish miqyosi va yuqori nosozliklarga chidamliligini ta'minlasa-da, tranzaksiya kafolatlarining yo'qolishi ularni missiya uchun muhim ma'lumotlar uchun yaroqsiz qiladi, degan argument mavjud.

Quyidagi jadvalda NoSQL-da ma'lumotlarni modellashtirish SQL-dan qanday farq qilishi ko'rsatilgan.

Ma'lumotlar bazasini loyihalash asoslari - PostgreSQL, Cassandra va MongoDB ni solishtirish

SQL va NoSQL: Nima uchun ikkalasi ham kerak?

Amazon.com, Netflix, Uber va Airbnb kabi ko'p sonli foydalanuvchilarga ega haqiqiy ilovalar murakkab, ko'p qirrali vazifalarni bajarish bilan shug'ullanadi. Masalan, Amazon.com kabi elektron tijorat ilovasi foydalanuvchi ma'lumotlari, mahsulotlar, buyurtmalar, hisob-fakturalar kabi engil va muhim ma'lumotlarni hamda mahsulot sharhlari, qo'llab-quvvatlash xabarlari, foydalanuvchi faoliyati kabi og'ir, kamroq sezgir ma'lumotlarni saqlashi kerak. foydalanuvchi sharhlari va tavsiyalari. Tabiiyki, bu ilovalar kamida bitta SQL ma'lumotlar bazasiga va kamida bitta NoSQL ma'lumotlar bazasiga tayanadi. Mintaqalararo va global tizimlarda NoSQL ma'lumotlar bazasi ma'lum bir mintaqada ishlaydigan ishonchli manba SQL ma'lumotlar bazasida saqlangan ma'lumotlar uchun geo taqsimlangan kesh sifatida ishlaydi.

YugaByte DB qanday qilib SQL va NoSQL-ni birlashtiradi?

Jurnalga yo'naltirilgan aralash xotira mexanizmi, avtomatik taqsimlash, taqsimlangan taqsimlangan konsensus replikatsiyasi va ACID taqsimlangan tranzaktsiyalar (Google Spanner tomonidan ilhomlantirilgan) asosida yaratilgan YugaByte DB dunyodagi birinchi ochiq manbali ma'lumotlar bazasi bo'lib, u bir vaqtning o'zida NoSQL (Cassandra & Redis) bilan mos keladi va SQL (PostgreSQL). Quyidagi jadvalda ko'rsatilganidek, YCQL, Cassandra bilan mos keladigan YugaByte DB API, NoSQL API-ga bitta va ko'p kalitli ACID tranzaktsiyalari va global ikkilamchi indekslar tushunchalarini qo'shadi va shu bilan tranzaktsion NoSQL ma'lumotlar bazalari davrini boshlaydi. Bundan tashqari, YCQL, PostgreSQL bilan mos keladigan YugaByte DB API, SQL API-ga chiziqli yozish miqyosi va avtomatik xatolarga chidamlilik tushunchalarini qo'shib, dunyoga tarqalgan SQL ma'lumotlar bazalarini olib keladi. YugaByte DB tranzaktsion xususiyatga ega bo'lganligi sababli, NoSQL API endi missiya uchun muhim ma'lumotlar kontekstida ishlatilishi mumkin.

Ma'lumotlar bazasini loyihalash asoslari - PostgreSQL, Cassandra va MongoDB ni solishtirish

Ilgari maqolada aytib o'tilganidek "YSQL bilan tanishish: YugaByte DB uchun PostgreSQL bilan mos keladigan taqsimlangan SQL API", YugaByte DBda SQL yoki NoSQL o'rtasidagi tanlov butunlay asosiy ish yukining xususiyatlariga bog'liq:

  • Agar sizning asosiy ish yukingiz ko'p kalitli JOIN operatsiyalari bo'lsa, YSQL ni tanlayotganda, kalitlaringiz bir nechta tugunlar bo'ylab taqsimlanishi mumkinligini tushunib oling, bu esa NoSQLga qaraganda yuqori kechikish va/yoki past o'tkazish qobiliyatiga olib keladi.
  • Aks holda, ikkita NoSQL API-dan birini tanlang, shu bilan birga, bir vaqtning o'zida bitta tugundan xizmat ko'rsatadigan so'rovlar natijasida yaxshiroq ishlashga ega bo'lishingizni yodda tuting. YugaByte DB bir vaqtning o'zida bir nechta ish yuklarini boshqarishi kerak bo'lgan haqiqiy, murakkab ilovalar uchun yagona operatsion ma'lumotlar bazasi bo'lib xizmat qilishi mumkin.

Keyingi bo'limdagi Ma'lumotlarni modellashtirish laboratoriyasi mahalliy ma'lumotlar bazalaridan farqli o'laroq, PostgreSQL va Cassandra API bilan mos keladigan YugaByte JB ma'lumotlar bazalariga asoslangan. Ushbu yondashuv ikkita turli ma'lumotlar bazasining mutlaqo mustaqil klasterlaridan foydalanishdan farqli o'laroq, bir xil ma'lumotlar bazasi klasterining ikki xil API (ikki xil portda) bilan o'zaro ta'sir qilish qulayligini ta'kidlaydi.
Keyingi bo'limlarda biz qamrab olingan ma'lumotlar bazalarining farqlari va ayrim umumiy tomonlarini ko'rsatish uchun ma'lumotlarni modellashtirish laboratoriyasini ko'rib chiqamiz.

Ma'lumotlarni modellashtirish laboratoriyasi

Ma'lumotlar bazasini o'rnatish

Ma'lumotlar modeli dizayniga (murakkab joylashtirish arxitekturalari o'rniga) e'tiborni hisobga olgan holda, biz mahalliy mashinada Docker konteynerlariga ma'lumotlar bazalarini o'rnatamiz va keyin ular bilan tegishli buyruq qatori qobiqlari yordamida o'zaro aloqa qilamiz.

PostgreSQL va Cassandra mos YugaByte DB ma'lumotlar bazasi

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

Buyruqlar qatoriga kirish

Tegishli APIlar uchun buyruq satri qobig'idan foydalanib ma'lumotlar bazalariga ulanamiz.

PostgreSQL

psql PostgreSQL bilan ishlash uchun buyruq qatori qobig'i. Foydalanish qulayligi uchun YugaByte DB to'g'ridan-to'g'ri bin papkasida psql bilan birga keladi.

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

Kassandra

cqlsh CQL (Cassandra Query Language) orqali Cassandra va uning mos ma'lumotlar bazalari bilan o'zaro ishlash uchun buyruq qatori qobig'i. Foydalanish qulayligi uchun YugaByte DB bilan birga keladi cqlsh katalogda bin.
E'tibor bering, CQL SQL-dan ilhomlangan va jadvallar, satrlar, ustunlar va indekslarning o'xshash tushunchalariga ega. Biroq, NoSQL tili sifatida u ma'lum cheklovlar to'plamini qo'shadi, ularning aksariyatini biz boshqa maqolalarda ham ko'rib chiqamiz.

docker exec -it yb-tserver-n1 /home/yugabyte/bin/cqlsh

MongoDB

Mongo MongoDB bilan ishlash uchun buyruq qatori qobig'i. Uni MongoDB o'rnatishning bin katalogida topish mumkin.

docker exec -it my-mongo bash 
cd bin
mongo

Jadval yarating

Endi biz buyruq qatori yordamida turli operatsiyalarni bajarish uchun ma'lumotlar bazasi bilan o'zaro aloqada bo'lishimiz mumkin. Keling, turli san'atkorlar tomonidan yozilgan qo'shiqlar haqidagi ma'lumotlarni saqlaydigan jadval yaratishdan boshlaylik. Bu qo'shiqlar albomning bir qismi bo'lishi mumkin. Qo'shiqning ixtiyoriy atributlari - chiqarilgan yili, narxi, janri va reytingi. Biz "teglar" maydoni orqali kelajakda kerak bo'lishi mumkin bo'lgan qo'shimcha atributlarni hisobga olishimiz kerak. U yarim tizimli ma'lumotlarni kalit-qiymat juftliklari shaklida saqlashi mumkin.

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)
);	

Kassandra

Cassandra-da jadval yaratish PostgreSQL-ga juda o'xshaydi. Asosiy farqlardan biri bu yaxlitlik cheklovlarining yo'qligi (masalan, NOT NULL), ammo bu NoSQL ma'lumotlar bazasi emas, balki dasturning javobgarligi.. Birlamchi kalit bo'lim kalitidan (quyidagi misoldagi Ijrochi ustuni) va klasterlash ustunlari to'plamidan (quyidagi misoldagi SongTitle ustunidan) iborat. Bo'lim kaliti qatorni qaysi bo'limga/parchaga joylashtirish kerakligini aniqlaydi va klasterlash ustunlari ma'lumotlar joriy parcha ichida qanday tashkil etilishi kerakligini ko'rsatadi.

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 ma'lumotlarni ma'lumotlar bazalarida (Ma'lumotlar bazasi) tashkil qiladi (Kassandradagi Keyspace-ga o'xshash), bu erda Hujjatlar (jadvaldagi qatorlarga o'xshash) mavjud To'plamlar (jadvallarga o'xshash). MongoDB-da, asosan, dastlabki sxemani aniqlashning hojati yo'q. Jamoa "ma'lumotlar bazasidan foydalanish", quyida ko'rsatilgan, birinchi qo'ng'iroqda ma'lumotlar bazasini yaratadi va yangi yaratilgan ma'lumotlar bazasi uchun kontekstni o'zgartiradi. Hatto to'plamlar ham aniq yaratilishi shart emas; ular yangi to'plamga birinchi hujjatni qo'shganda avtomatik tarzda yaratiladi. E'tibor bering, MongoDB sukut bo'yicha test ma'lumotlar bazasidan foydalanadi, shuning uchun ma'lum bir ma'lumotlar bazasini ko'rsatmasdan yig'ish darajasidagi har qanday operatsiya sukut bo'yicha ishlaydi.

use myNewDatabase;

Jadval haqida ma'lumot olish
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)

Kassandra

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;

Jadvalga ma'lumotlarni kiritish
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}'
);

Kassandra

Umumiy ifoda INSERT Kassandrada PostgreSQL-ga juda o'xshash. Biroq, semantikada bitta katta farq bor. Kassandrada INSERT aslida operatsiya hisoblanadi UPSERT, agar qator allaqachon mavjud bo'lsa, oxirgi qiymatlar qatorga qo'shiladi.

Ma'lumotlarni kiritish PostgreSQL ga o'xshaydi INSERT oliy

.

MongoDB

MongoDB Cassandra kabi NoSQL ma'lumotlar bazasi bo'lsa ham, uni kiritish operatsiyasi Kassandraning semantik xatti-harakati bilan hech qanday umumiylik yo'q. MongoDB da kiritmoq() imkoniyatlarga ega emas UPSERT, bu uni PostgreSQL-ga o'xshash qiladi. Standart maʼlumotlarsiz qoʻshilmoqda _idspecified to'plamga yangi hujjat qo'shilishiga olib keladi.

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"
}
}
);

Jadval so'rovi

Ehtimol, so'rovlarni tuzish nuqtai nazaridan SQL va NoSQL o'rtasidagi eng muhim farq ishlatiladigan tildir FROM и WHERE. SQL ifodadan keyin ruxsat beradi FROM bir nechta jadval va ifodani tanlang WHERE har qanday murakkablikda bo'lishi mumkin (shu jumladan operatsiyalar JOIN jadvallar orasida). Biroq, NoSQL jiddiy cheklovlarni qo'yishga moyildir FROM, va faqat bitta belgilangan jadval bilan ishlash va ichida WHERE, asosiy kalit har doim ko'rsatilishi kerak. Bu biz ilgari aytib o'tgan NoSQL unumdorligiga bog'liq. Bu istak har qanday o'zaro jadvallar va o'zaro kalit o'zaro ta'sirning har qanday mumkin bo'lgan qisqarishiga olib keladi. Bu so'rovga javob berishda tugunlararo aloqada katta kechikishni keltirib chiqarishi mumkin va shuning uchun umuman olganda undan qochish yaxshiroqdir. Masalan, Cassandra so'rovlar ma'lum operatorlar bilan cheklanishini talab qiladi (faqat =, IN, <, >, =>, <=) bo'lim kalitlarida, ikkinchi darajali indeksni so'rash hollari bundan mustasno (bu erda faqat = operatoriga ruxsat beriladi).

PostgreSQL

Quyida SQL ma'lumotlar bazasi tomonidan osongina bajarilishi mumkin bo'lgan so'rovlarning uchta misoli keltirilgan.

  • Ijrochining barcha qo'shiqlarini ko'rsatish;
  • Sarlavhaning birinchi qismiga mos keladigan ijrochining barcha qo'shiqlarini ko'rsatish;
  • Sarlavhasida ma'lum bir so'z bo'lgan va narxi 1.00 dan past bo'lgan ijrochining barcha qo'shiqlarini ko'rsating.
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;

Kassandra

Yuqorida sanab o'tilgan PostgreSQL so'rovlaridan faqat birinchisi Cassandra'da o'zgarishsiz ishlaydi, chunki operator LIKE kabi klasterlash ustunlariga qo'llash mumkin emas SongTitle. Bunday holda, faqat operatorlarga ruxsat beriladi = и 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

Oldingi misollarda ko'rsatilganidek, MongoDB-da so'rovlarni yaratishning asosiy usuli db.collection.find(). Bu usul to'plam nomini aniq o'z ichiga oladi (music quyidagi misolda), shuning uchun bir nechta to'plamlarni so'rash taqiqlanadi.

db.music.find( {
  artist: "No One You Know"
 } 
);
db.music.find( {
  artist: "No One You Know",
  songTitle: /Call/
 } 
);

Jadvalning barcha qatorlarini o'qish

Barcha satrlarni o'qish biz avval ko'rib chiqqan so'rov namunasining alohida holatidir.

PostgreSQL

SELECT * 
FROM Music;

Kassandra

Yuqoridagi PostgreSQL misoliga o'xshash.

MongoDB

db.music.find( {} );

Jadvaldagi ma'lumotlarni tahrirlash

PostgreSQL

PostgreSQL ko'rsatmalar beradi UPDATE ma'lumotlarni o'zgartirish uchun. Uning imkoniyatlari yo'q UPSERT, shuning uchun satr endi ma'lumotlar bazasida bo'lmasa, bu bayonot muvaffaqiyatsiz bo'ladi.

UPDATE Music
SET Genre = 'Disco'
WHERE Artist = 'The Acme Band' AND SongTitle = 'Still In Love';

Kassandra

Kassandra bor UPDATE PostgreSQL-ga o'xshash. UPDATE bir xil semantikaga ega UPSERT, o'xshash INSERT.

Yuqoridagi PostgreSQL misoliga o'xshash.

MongoDB
Operatsiya yangilash () MongoDB-da mavjud hujjatni to'liq yangilash yoki faqat ma'lum maydonlarni yangilash mumkin. Odatiy bo'lib, u semantika o'chirilgan holda faqat bitta hujjatni yangilaydi UPSERT. Bir nechta hujjatlarni yangilash va shunga o'xshash xatti-harakatlar UPSERT operatsiya uchun qo'shimcha bayroqlarni o'rnatish orqali qo'llanilishi mumkin. Masalan, quyidagi misolda ma’lum bir san’atkorning janri uning qo‘shig‘iga qarab yangilanadi.

db.music.update(
  {"artist": "The Acme Band"},
  { 
    $set: {
      "genre": "Disco"
    }
  },
  {"multi": true, "upsert": true}
);

Jadvaldan ma'lumotlarni olib tashlash

PostgreSQL

DELETE FROM Music
WHERE Artist = 'The Acme Band' AND SongTitle = 'Look Out, World';

Kassandra

Yuqoridagi PostgreSQL misoliga o'xshash.

MongoDB

MongoDB-da hujjatlarni o'chirish uchun ikki turdagi operatsiyalar mavjud - deleteOne() /deleteMany() и olib tashlash (). Ikkala tur ham hujjatlarni o'chiradi, lekin turli natijalar beradi.

db.music.deleteMany( {
        artist: "The Acme Band"
    }
);

Jadvalni o'chirish

PostgreSQL

DROP TABLE Music;

Kassandra

Yuqoridagi PostgreSQL misoliga o'xshash.

MongoDB

db.music.drop();

xulosa

SQL va NoSQL o'rtasida tanlov haqida munozaralar 10 yildan ortiq davom etmoqda. Ushbu bahsning ikkita asosiy jihati mavjud: ma'lumotlar bazasi mexanizmi arxitekturasi (monolitik, tranzaktsion SQL va taqsimlangan, tranzaksiyasiz NoSQL) va ma'lumotlar bazasini loyihalash yondashuvi (SQLda ma'lumotlaringizni modellashtirish va NoSQLda so'rovlaringizni modellashtirish).

YugaByte DB kabi taqsimlangan tranzaktsion ma'lumotlar bazasi bilan ma'lumotlar bazasi arxitekturasi haqidagi bahslarni osongina to'xtatish mumkin. Ma'lumotlar hajmi bitta tugunga yozilishi mumkin bo'lgan hajmdan kattaroq bo'lganda, avtomatik parchalanish/qayta muvozanatlash bilan chiziqli yozish miqyosini qo'llab-quvvatlaydigan to'liq taqsimlangan arxitektura zarur bo'ladi.

Bundan tashqari, maqolalardan birida aytilganidek Google Cloud,Tranzaksiyaviy, kuchli izchil arxitekturalar endi tranzaksiyaviy bo'lmagan, oxir-oqibat izchil arxitekturalarga qaraganda yaxshiroq rivojlanish tezligini ta'minlash uchun ko'proq foydalanilmoqda.

Ma'lumotlar bazasini loyihalash muhokamasiga qaytadigan bo'lsak, shuni aytish kerakki, har ikkala dizayn yondashuvi (SQL va NoSQL) har qanday murakkab real dastur uchun zarurdir. SQL "ma'lumotlarini modellashtirish" yondashuvi ishlab chiquvchilarga o'zgaruvchan biznes talablariga osonroq javob berishga imkon beradi, NoSQL "so'rovlarni modellashtirish" yondashuvi esa bir xil ishlab chiquvchilarga past kechikish va yuqori o'tkazuvchanlik bilan katta hajmdagi ma'lumotlar bilan ishlash imkonini beradi. Aynan shuning uchun YugaByte DB yondashuvlardan birini targ'ib qilish o'rniga SQL va NoSQL API'larini umumiy yadroda taqdim etadi. Bundan tashqari, PostgreSQL va Cassandra kabi mashhur ma'lumotlar bazasi tillari bilan moslikni ta'minlash orqali YugaByte DB ishlab chiquvchilarga taqsimlangan, yuqori izchil ma'lumotlar bazasi mexanizmi bilan ishlash uchun boshqa tilni o'rganish shart emasligini ta'minlaydi.

Ushbu maqolada biz ma'lumotlar bazasini loyihalash asoslari PostgreSQL, Cassandra va MongoDB o'rtasida qanday farq qilishini ko'rib chiqdik. Kelgusi maqolalarda biz indekslar, tranzaktsiyalar, JOINlar, TTL direktivalari va JSON hujjatlari kabi ilg'or dizayn tushunchalarini ko'rib chiqamiz.

Dam olish kunlarini ajoyib o'tkazishingizni tilaymiz va sizni taklif qilamiz bepul vebinar, bu 14-may kuni bo'lib o'tadi.

Manba: www.habr.com

a Izoh qo'shish