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ər | Güclü tərəfi |
|---|---|---|
| Relyasiya | PostgreSQL, MySQL | əlaqələr, JOIN, məhdudiyyətlər, ACID |
| Sənəd | MongoDB, Firestore | içi-içə JSON sənədləri, çevik sxem |
| Açar–qiymət | Redis, Memcached, DynamoDB | açar üzrə get/set millisaniyənin hissəsində, TTL |
| Wide-column | Cassandra, ScyllaDB | nəhəng yazı axını, qovşaq əlavə etməklə böyümə |
| Qraf | Neo4j, Neptune | əlaqələri çox addım dərinliyə gəzmək |
| Axtarış | OpenSearch, Meilisearch | tam 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ə:
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 doesRelyasiya 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:
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?' },
],
};