Məzmuna keç
Educora
Universitet25 dəq56 / 59

Verilənlər bazaları nəzəriyyəsi

Relyasiya modelini, açarları, funksional asılılıqları, 1NF–3NF normallaşdırmanı addım-addım nümunə ilə, tranzaksiyaları və ACID-i, indeksləri və SQL ilə NoSQL fərqini öyrən.

Özünü yoxla
Bu dərsdə öyrənəcəksən
  • Superaçar, namizəd, ilkin və xarici açarı fərqləndirmək
  • Funksional asılılıqlara əsasən cədvəli 3NF-ə qədər normallaşdırmaq
  • ACID xassələrini izah etmək və indeksin qazancını hesablamaq

Onlayn mağaza hər sifarişi bir Excel sətrinə yazsaydı, Anar Bakıdan Gəncəyə köçəndə onun ünvanını yüzlərlə sətirdə dəyişmək lazım gələrdi, birini unutsaydın, bazada iki fərqli şəhər qalardı. Verilənlər bazası nəzəriyyəsi belə problemləri riyazi dəqiqliklə aradan qaldırır: verilənləri düzgün cədvəllərə bölür, onları eyni anda yüzlərlə istifadəçidən qoruyur və milyardlarla sətir arasında axtarışı millisaniyələrə endirir.

Relyasiya modeli və açarlar

1970-ci ildə Edqar Koddun təklif etdiyi relyasiya modelində verilənlər münasibətlərdə (cədvəllərdə) saxlanır. Münasibət — eyni atributlara malik kortejlər (sətirlər) çoxluğudur; hər atributun domeni (icazəli qiymətlər çoxluğu) var. Çoxluq olduğu üçün sətirlərin sırası yoxdur və iki eyni sətir ola bilməz. Sorğular relyasiya cəbri ilə ifadə olunur, SQL isə onun praktik dilidir.

π[first_name](σ[city = 'Bakı'](students)) ≡ SELECT first_name FROM students WHERE city = 'Bakı'
burada:
  • σseçmə (selection): şərtə uyğun sətirlər — WHERE
  • πproyeksiya: lazımi sütunlar — SELECT siyahısı
  • ⋈birləşmə (join): iki münasibətin ortaq atribut üzrə birləşdirilməsi — JOIN
AçarTərifNümunə (students)
Superaçarsətri birmənalı müəyyən edən istənilən atributlar çoxluğu{id}, {id, city}
Namizəd açarminimal superaçar (heç bir atributu atmaq olmaz){id}
İlkin açarseçilmiş namizəd açar: unikal və NULL ola bilməzid
Xarici açarbaşqa cədvəlin ilkin açarına istinad (referensial bütövlük)enrollments.student_id → students.id
SQL
SELECT COUNT(*)              AS students,
       COUNT(email)          AS with_email,
       COUNT(DISTINCT email) AS distinct_emails,
       COUNT(DISTINCT city)  AS distinct_cities
FROM students;
▸ Gözlənilən nəticə
students | with_email | distinct_emails | distinct_cities
12 | 10 | 10 | 7
Açarı verilənlərlə yoxlayırıq: city açar ola bilməz (12 sətirdə cəmi 7 fərqli şəhər). email doldurulmuş sətirlərdə unikaldır (10 = 10), amma 2 tələbədə NULL-dur — ona görə ilkin açar ola bilməz. Diqqət: verilənlərin indiki halı açarı sübut etmir, açar biznes qaydasıdır.

Normallaşdırma: 1NF, 2NF, 3NF

Pis layihələndirilmiş cədvəl üç növ anomaliya yaradır. Yeniləmə anomaliyası: eyni fakt çox sətirdə təkrarlanır və biri yenilənməsə, ziddiyyət yaranır. Əlavə anomaliyası: hələ sifarişi olmayan yeni məhsulu cədvələ yazmaq mümkün deyil, çünki açarın bir hissəsi boş qalır. Silmə anomaliyası: müştərinin yeganə sifarişini silsən, müştəri haqqında bütün məlumat da itir. Normallaşdırma cədvəli itkisiz hissələrə bölərək bu anomaliyaları aradan qaldırır: hər fakt bir yerdə saxlanır.

Tərif
Funksional asılılıq X → Y

X atributlarının qiyməti eyni olan iki sətirdə Y atributlarının qiyməti də mütləq eynidir. Məsələn, customer_id → customer_city: müştərini bilsən, şəhərini də bilirsən. Normallaşdırma məhz bu asılılıqlara əsaslanır.

FormaTələbNəyi aradan qaldırır
1NFhər xanada bir atomar qiymət, təkrarlanan qruplar yoxdur«Laptop, Qulaqlıq» kimi siyahı-xanaları
2NF1NF + heç bir qeyri-açar atribut tərkibli açarın bir hissəsindən asılı deyilqismən asılılıqları
3NF2NF + qeyri-açar atributlar yalnız açardan asılıdır, bir-birindən yoxtranzitiv asılılıqları
3NF-in yadda qalan ifadəsi: hər qeyri-açar atribut «açardan, bütün açardan və açardan başqa heç nədən» asılı olmalıdır.
Nümunə 1: sifarişlər cədvəlini 3NF-ə gətirmək

Mağaza cədvəli: order_id, order_date, customer_id, customer_name, customer_city, products və products xanasında «Laptop ×1, Headphones ×2» kimi siyahı. Qiymət və kateqoriya da bu siyahıdadır. Cədvəli 1NF, 2NF və 3NF-ə gətir.

Həllini göstər
1NF: siyahını açırıq — hər (sifariş, məhsul) üçün bir sətir:
(order_id, product_id, order_date, customer_id, customer_name, customer_city, product_name, category, price, quantity), açar (order_id, product_id).
Asılılıqlar: order_id → order_date, customer_id; customer_id → customer_name, customer_city; product_id → product_name, category, price; (order_id, product_id) → quantity.
2NF: açarın hissəsindən asılı olanları ayırırıq:
order_items(order_id, product_id, quantity)
orders(order_id, order_date, customer_id, customer_name, customer_city)
products(product_id, product_name, category, price)
3NF: orders-da order_id → customer_id → customer_city tranzitivdir, ayırırıq:
orders(order_id, order_date, customer_id) + customers(customer_id, customer_name, customer_city).
Nəticə: 4 cədvəl. İndi Anarın şəhəri bir xanada dəyişir.
SQL
SELECT s.first_name, s.city, c.title, c.teacher, e.score
FROM enrollments AS e
JOIN students AS s ON s.id = e.student_id
JOIN courses AS c ON c.id = e.course_id
WHERE c.teacher = 'Ramin Səfərov'
ORDER BY c.title, s.first_name;
▸ Gözlənilən nəticə
first_name | city | title | teacher | score
Aysel | Bakı | Algebra | Ramin Səfərov | 92
Fidan | Naxçıvan | Algebra | Ramin Səfərov | 97
Murad | Gəncə | Algebra | Ramin Səfərov | 75
Nigar | Şəki | Algebra | Ramin Səfərov | 85
Leyla | Bakı | Geometry | Ramin Səfərov | 95
Orxan | Sumqayıt | Geometry | Ramin Səfərov | 70
Səbinə | Quba | Geometry | Ramin Səfərov | 79
Nümunə baza normallaşdırılıb: students, courses, enrollments. JOIN «düz» cədvəli yalnız lazım olanda bərpa edir — burada müəllimin adı 7 dəfə təkrarlanır. Əgər o, cədvəldə belə saxlansaydı, müəllimin dəyişməsi 7 sətrin yenilənməsini tələb edərdi (yeniləmə anomaliyası).

Tranzaksiyalar və ACID

XassəMənasıNecə təmin olunur
Atomarlıq (A)ya hamısı, ya heç nəROLLBACK, geri qaytarma jurnalı
Uyğunluq (C)baza bir düzgün vəziyyətdən digərinə keçirməhdudiyyətlər: açarlar, CHECK, xarici açarlar
Təcridolunma (I)paralel tranzaksiyalar bir-birinin yarımçıq işini görmürkilidlər, çoxversiyalılıq (MVCC)
Davamlılıq (D)COMMIT-dən sonra verilənlər elektrik kəsilsə də qalırəvvəlcədən yazılan jurnal (WAL)
SQL
BEGIN;
UPDATE products SET stock = stock - 2 WHERE name = 'Laptop';
INSERT INTO orders (customer_id, product_id, quantity, order_date)
VALUES (2, 1, 2, '2025-08-01');
ROLLBACK;

SELECT name, stock,
       (SELECT COUNT(*) FROM orders) AS orders_total
FROM products
WHERE name = 'Laptop';
▸ Gözlənilən nəticə
name | stock | orders_total
Laptop | 8 | 12
Atomarlıq praktikada: tranzaksiya anbardan 2 noutbuk çıxarıb sifariş yazdı, sonra ləğv olundu (ROLLBACK). Nəticədə hər iki dəyişiklik yoxa çıxdı: ehtiyat yenə 8, sifarişlər yenə 12-dir. COMMIT yazsaydıq, ikisi də birlikdə saxlanardı.

Tam təcridolunma bahalıdır, ona görə SQL dörd təcrid səviyyəsi təklif edir. READ UNCOMMITTED-də «çirkli oxu» (başqasının hələ təsdiqlənməmiş dəyişikliyini görmək), READ COMMITTED-də «təkrarlanmayan oxu» (eyni sətir iki oxuda fərqli), REPEATABLE READ-də «fantomlar» (yeni sətirlərin peyda olması) mümkündür; SERIALIZABLE isə tranzaksiyaların ardıcıl icrası ilə eyni nəticəni təmin edir.

İndekslər, SQL və NoSQL

h = ⌈log N / log f⌉h = ⌈log N / log f⌉
burada:
  • hB-ağacı indeksinin hündürlüyü (axtarışda oxunan səhifələr)
  • Ncədvəldəki sətirlərin sayı
  • fbudaqlanma: bir səhifəyə sığan açarların sayı
Nümunə 2: indeksin qazancı

Cədvəldə N = 10⁷ sətir var, bir disk səhifəsinə 100 sətir sığır. WHERE email = … sorğusu üçün indekssiz və f = 100 olan B-ağacı indeksi ilə neçə səhifə oxunur?

Həllini göstər
İndekssiz — tam skan: 10⁷ / 100 = 10⁵ səhifə.
İndekslə: h = ⌈log 10⁷ / log 100⌉ = ⌈7/2⌉ = ⌈3,5⌉ = 4 səviyyə + 1 səhifə sətrin özü = ≈ 5 səhifə.
Qazanc ≈ 20 000 dəfə: O(N) əvəzinə O(log N). Bədəli: indeks yer tutur və hər INSERT/UPDATE onu da yeniləməlidir.
MeyarSQL (relyasiya)NoSQL
modelcədvəllər və əlaqələrsənəd, açar–qiymət, sütun ailələri, qraf
sxemsərt, əvvəlcədən müəyyənçevik
tranzaksiyalartam ACIDçox vaxt məhdud, «sonda uyğunluq»
miqyaslanmaəsasən şaquli (güclü server)üfüqi (çoxlu server)
nümunələrPostgreSQL, MySQL, SQLite, SQL ServerMongoDB, Redis, Cassandra, Neo4j
Seçim məsələdən asılıdır: bank hesabları — SQL, sessiya keşi — Redis, sosial əlaqələr — qraf bazası. Çox layihə hər ikisini birlikdə işlədir.

Əsas fikirlər

  • Münasibət — kortejlər çoxluğudur; namizəd açar minimal superaçardır, ilkin açar unikal və NOT NULL-dur, xarici açar bütövlüyü qoruyur.
  • 1NF — atomar qiymətlər; 2NF — qismən asılılıq yoxdur; 3NF — tranzitiv asılılıq yoxdur.
  • Normallaşdırma yeniləmə, əlavə və silmə anomaliyalarını aradan qaldırır.
  • ACID: atomarlıq, uyğunluq, təcridolunma, davamlılıq; ROLLBACK tranzaksiyanı tam ləğv edir.
  • B-ağacı indeksi axtarışı O(N)-dən O(log N)-ə endirir, amma yazmanı yavaşladır.

Özünü yoxla

10 sual. Hər düzgün cavab XP qazandırır.

1 / 10
grades(student_id, course_id, student_name, score), açar (student_id, course_id), student_id → student_name. Cədvəl hansı normal formanı pozur?