Murad deyir: «Gəlin hər şeyi MongoDB-də saxlayaq, o, miqyaslanır». Leyla cavab verir: «Mən hər şeyi PostgreSQL-də saxlayardım». Kim haqlıdır? İkisi də yarıya qədər. Prowid Photos çox müxtəlif şeylər saxlayır: hesablar və izləmələr, foto faylları, bəyənmə sayğacları, sessiyalar, yazılar üzrə axtarış. Sual «SQL, yoxsa NoSQL» deyil, «hər hissəyə nə lazımdır və biz nədən imtina etməyə hazırıq» sualıdır. Bu dərsdə anbar ailələrini, ACID və BASE-i, CAP teoremini (və orada «partition»-un nə demək olduğunu), uyğunluq modellərini və sistemin hər hissəsi üçün anbar seçimini öyrənəcəyik.

«SQL, yoxsa NoSQL» — dəqiq olmayan sualdır

NoSQL «not only SQL» kimi oxunur. Bu, bir növ baza deyil, 2000-ci illərdə çoxlu serverə böyümək, çevik məlumat saxlamaq və dar sorğulara tez cavab vermək lazım gələndə yaranmış ailələr dəstəsidir. Sərhədlər bulanıqdır: PostgreSQL JSON saxlayır (jsonb), MongoDB isə tranzaksiyaları bacarır. Əsas ailələr:

AiləNümunələrGüclü tərəfi
RelyasiyaPostgreSQL, MySQLəlaqələr, JOIN, məhdudiyyətlər, ACID
SənədMongoDB, Firestoreiçi-içə JSON sənədləri, çevik sxem
Açar–qiymətRedis, Memcached, DynamoDBaçar üzrə get/set millisaniyənin hissəsində, TTL
Wide-columnCassandra, ScyllaDBnəhəng yazı axını, qovşaq əlavə etməklə böyümə
QrafNeo4j, Neptuneəlaqələri çox addım dərinliyə gəzmək
AxtarışOpenSearch, Meilisearchtam mətn axtarışı, relevantlıq

💡 Wide-column-u (Cassandra) analitik sütunlu bazalarla (ClickHouse, BigQuery) qarışdırmayın: onlar məlumatı sütunlar üzrə saxlayır və milyardlarla sətir üzrə aqreqatları tez hesablayır. Foto faylları isə bunların heç birində yaşamır — onlar S3 obyekt anbarına gedir.

Relyasiya bazaları və ACID

Cədvəllər, sərt sxem, SQL və əsas kozır — ACID tranzaksiyaları: Atomicity (bütün dəyişikliklər tətbiq olunur və ya heç biri), Consistency (məhdudiyyətlər pozulmur), Isolation (paralel tranzaksiyalar bir-birinin məlumatını korlamır), Durability (təsdiqlənən çökmədə itmir). Klassika — Leyladan Murada 100 AZN köçürmə:

sql
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1; -- Leyla
UPDATE accounts SET balance = balance + 100 WHERE id = 2; -- Murad
COMMIT; -- both changes happen, or neither does

Relyasiya bazası məlumat bağlı olanda, bütövlük vacib olanda və «necə istəsən» sorğular lazım olanda idealdır. O, şaquli və replikalarla böyüyür; şardinq isə gördüyümüz kimi daha çətindir.

Digər ailələr nümunələrlə

Sənəd modeli birlikdə oxunanı birlikdə saxlayır, JOIN olmadan. Sxem çevikdir, amma məlumat təkrarlanır, sənədlər arasındakı əlaqələr isə zəif yerdir. MongoDB ilə «MongoDB: sənəd modeli və bazanın işə salınması» dərsində işləmisiniz:

js
const photo = {
  _id: 'p42',
  owner: { id: 7, name: 'Leyla' },
  caption: 'Baku at night',
  tags: ['baku', 'night', 'city'],
  exif: { camera: 'X100V', iso: 800 },
  comments: [
    { by: 'Murad', text: 'Great shot!' },
    { by: 'Aysel', text: 'Where is this?' },
  ],
};