- Obyektləri, atributları və əlaqələri ER modelində təsvir etmək, 1:1, 1:N və M:N əlaqələrini cədvəllərə çevirmək
- Funksional asılılıqları və namizəd açarları tapmaq, yeniləmə, əlavə və silmə anomaliyalarını izah etmək
- Cədvəli itkisiz şəkildə 2NF, 3NF və BCNF-yə parçalamaq və asılılıqların qorunmasını qiymətləndirmək
Təsəvvür et ki, kurs qeydiyyatı bir böyük Excel cədvəlində aparılır: hər sətirdə şagirdin adı, şəhəri, kursun adı, müəllim və bal. Müəllim soyadını dəyişəndə onu yüzlərlə sətirdə düzəltmək lazımdır, birini unutsan, baza özü ilə ziddiyyətə düşür. Yeni kursa hələ heç kim yazılmayıbsa, onu əlavə etmək mümkün deyil, sonuncu şagird kursdan çıxanda isə kursun özü də yoxa çıxır. Bu dərsdə bazanı elə layihələndirməyi öyrənəcəyik ki, hər fakt yalnız bir yerdə saxlansın. Bunun elmi adı normallaşdırmadır, məşq bazamız da məhz bu qaydalarla qurulub.
ER modeli: obyektlər, əlaqələr, kardinallıq
Layihələndirmə cədvəllərdən yox, konseptual modeldən başlayır. Obyekt (entity) — haqqında məlumat saxladığımız şeydir: şagird, kurs, məhsul. Atribut onun xüsusiyyətidir: ad, qiymət. Əlaqə (relationship) obyektləri bağlayır: şagird kursa yazılır, müştəri məhsulu sifariş edir. Bu modeli 1976-cı ildə Piter Çen «obyekt–əlaqə» (ER) diaqramları şəklində təklif edib.
Bir obyektin neçə nüsxəsinin digər obyektin bir nüsxəsi ilə əlaqəli ola biləcəyini göstərir: birin-birə (1:1), birin-çoxa (1:N) və ya çoxun-çoxa (M:N). Kardinallıq xarici açarın hansı cədvəldə yerləşəcəyini müəyyən edir.
| Əlaqə | Nümunə | Cədvəllərdə necə qurulur |
|---|---|---|
| 1:1 | şagird — tələbə bileti | ikinci cədvəldə UNIQUE xarici açar və ya ümumi əsas açar |
| 1:N | müştəri — sifarişlər | «çox» tərəfdə xarici açar: orders.customer_id |
| M:N | şagirdlər — kurslar | iki xarici açarlı aralıq cədvəl: enrollments |
Funksional asılılıqlar və açarlar
Normallaşdırmanın əsas anlayışı funksional asılılıqdır (FA). X → Y yazılışı «X-in qiyməti Y-in qiymətini birmənalı müəyyən edir» deməkdir: course_id → teacher — kursu bilsək, müəllimi də bilirik. FA məlumatın təsadüfi xüsusiyyəti yox, biznes qaydasıdır: onu sahə mütəxəssisindən öyrənirik, cədvəldəki cari sətirlər isə yalnız onu təkzib edə bilər.
- Xmüəyyənedici (determinant) — atributlar çoxluğu
- Yasılı atributlar çoxluğu
- rcədvəlin (münasibətin) istənilən icazəli halı
- t₁, t₂cədvəlin istənilən iki sətri; t[X] — sətrin X sütunlarındakı qiymətlər
X-də üst-üstə düşən iki sətir Y-də də üst-üstə düşməlidir.
Bütün digər atributları müəyyən edən atributlar çoxluğu superaçardır; heç bir atributu atıla bilməyən superaçar isə namizəd açardır. Namizəd açarlardan biri əsas açar seçilir. Hər hansı namizəd açara daxil olan atribut açar (prime) atribut adlanır — bu fərq 3NF və BCNF-ni ayırmaq üçün lazım olacaq.
Anomaliyalar: təkrarçılıq niyə təhlükəlidir
- Yeniləmə anomaliyası — eyni fakt bir neçə sətirdədir, bir nüsxə dəyişəndə digərləri köhnə qalır.
- Əlavə anomaliyası — bir faktı başqa fakt olmadan yazmaq olmur (yazılışı olmayan kursu əlavə etmək).
- Silmə anomaliyası — bir faktı silmək başqa faktı da məhv edir (sonuncu yazılışla birlikdə kursun müəllimi də itir).
-- a denormalised copy: the teacher is repeated in every row
CREATE TABLE report_flat AS
SELECT e.student_id, s.first_name, e.course_id, 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;
-- the name is corrected in one row only
UPDATE report_flat SET teacher = 'R. Safarov'
WHERE course_id = 1 AND student_id = 1;
SELECT course_id, teacher, COUNT(*) AS rows_with_it
FROM report_flat
WHERE course_id = 1
GROUP BY course_id, teacher
ORDER BY teacher;▸ Gözlənilən nəticə
course_id | teacher | rows_with_it 1 | R. Safarov | 1 1 | Ramin Səfərov | 3
courses-də bir dəfə dəyişdirilir.Normal formalar: 1NF-dən BCNF-yə
| Forma | Qayda | Tipik pozuntu |
|---|---|---|
| 1NF | hər xanada tək (atomar) qiymət, təkrarlanan qruplar yoxdur, sətirləri açar ayırır | phones = '050…, 055…' |
| 2NF | 1NF + açar olmayan atribut bütün namizəd açardan asılıdır, onun bir hissəsindən yox | açar (student_id, course_id), amma student_id → city |
| 3NF | 2NF + açar olmayan atribut başqa açar olmayan atributdan asılı deyil, yəni tranzitiv asılılıq yoxdur | course_id → teacher → teacher_phone |
| BCNF | hər qeyri-trivial X → Y üçün X superaçardır | teacher → subject, halbuki teacher açar deyil |
report(student_id, first_name, city, course_id, title, teacher, score) cədvəli verilib, açar (student_id, course_id)-dir. FA-lar: student_id → first_name, city; course_id → title, teacher; (student_id, course_id) → score. Cədvəl hansı normal formadadır və onu necə parçalamalı?
Həllini göstərHəllini gizlət
2)
first_name, city açarın yalnız bir hissəsindən (student_id) asılıdır — qismən asılılıq, 2NF pozulur. title, teacher də eyni səbəbdən.3) Hər müəyyənedici üçün ayrıca cədvəl:
students(student_id, first_name, city), courses(course_id, title, teacher), enrollments(student_id, course_id, score).4) Yoxlama: hər cədvəldə yeganə müəyyənedici onun açarıdır — nəticə BCNF-dədir və məhz məşq bazamızın strukturudur.
Parçalama itkisiz olmalıdır: hissələri JOIN edəndə ilkin cədvəl artıq və ya əskik sətir olmadan geri qayıtmalıdır. İki hissəyə bölmə üçün bunu Hit teoremi ilə yoxlayırıq: ortaq sütunlar hissələrdən birinin açarı olmalıdır.
- R₁, R₂parçalamadan alınan iki cədvəlin atributlar çoxluqları (R₁ ∪ R₂ = R)
- R₁ ∩ R₂ortaq atributlar —
JOIN-in aparıldığı sütunlar
Şərt ödənirsə, parçalama itkisizdir: R = R₁ ⋈ R₂.
lessons(student, subject, teacher): hər müəllim yalnız bir fənn keçir (teacher → subject), şagirdin hər fəndən bir müəllimi var ((student, subject) → teacher). Cədvəl 3NF-dədirmi, BCNF-dədirmi? Onu BCNF-yə necə gətirmək olar və nə itirilir?
Həllini göstərHəllini gizlət
(student, subject) və (student, teacher). Üç atributun hamısı açar atributdur.2)
teacher → subject: teacher superaçar deyil, amma subject açar atributdur — 3NF buna icazə verir, BCNF isə yox.3) BCNF parçalaması:
teachers(teacher, subject) və assignments(student, teacher). Ortaq atribut teacher birinci cədvəlin açarıdır — Hit teoreminə görə itkisizdir.4) Qiyməti:
(student, subject) → teacher asılılığı artıq bir cədvəldə yoxlanıla bilmir; şagirdə eyni fəndən iki müəllim yazmağın qarşısını trigger və ya tətbiq kodu almalıdır.Denormallaşdırma nə vaxt doğrudur
Normallaşdırma gündəlik əməliyyatlar (OLTP) üçün idealdır: çoxlu kiçik yazma, dəqiqlik, ziddiyyətsizlik. Analitik anbarlarda (OLAP) isə məlumat əsasən oxunur, ona görə bilərəkdən denormallaşdırırlar: «ulduz sxemi»ndə mərkəzdə faktlar cədvəli (satışlar), ətrafında isə geniş ölçü cədvəlləri (məhsul, müştəri, tarix) olur və hesabatlar az JOIN ilə işləyir. Qızıl qayda: əvvəlcə 3NF-də layihələndir, denormallaşdırmanı isə yalnız ölçülmüş performans problemi olanda və sinxronizasiya mexanizmi (trigger, görünüş, gecə yenilənməsi) ilə birlikdə tətbiq et.
Normallaşdırılmış cədvəllərdən Mechanics kursu üçün «düz» hesabatı bərpa et: şagirdin adı, şəhəri, kursun adı, müəllim və bal. Nəticəni bala görə azalan sırada düz. (İtkisiz parçalamada JOIN ilkin cədvəli tam qaytarır.)
SELECT s.first_name, s.city, c.title, c.teacher, e.score
FROM enrollments AS e
-- join students and courses
WHERE c.title = 'Mechanics'
ORDER BY e.score DESC;▸ Gözlənilən nəticə
first_name | city | title | teacher | score Fidan | Naxçıvan | Mechanics | Ülviyyə Axundova | 94 Murad | Gəncə | Mechanics | Ülviyyə Axundova | 81 Rəşad | Bakı | Mechanics | Ülviyyə Axundova | 77 Elvin | Sumqayıt | Mechanics | Ülviyyə Axundova | 68
teacher → subject asılılığının cari məlumatda ödənildiyini yoxla: hər müəllim üçün fərqli fənlərin sayını (subjects) göstər və müəllimə görə düz. Bütün qiymətlər 1-dirsə, məlumat asılılığı təkzib etmir.
SELECT teacher
-- number of different subjects
FROM courses
GROUP BY teacher
ORDER BY teacher;▸ Gözlənilən nəticə
teacher | subjects Elnur Qasımov | 1 Nərmin Vəliyeva | 1 Ramin Səfərov | 1 Samir Hacıyev | 1 Sara Mitchell | 1 Ülviyyə Axundova | 1
Əsas fikirlər
- Layihələndirmə ER modelindən başlayır; M:N əlaqəsi iki xarici açarlı aralıq cədvəllə qurulur.
X → Yfunksional asılılığı biznes qaydasıdır: X-də eyni olan sətirlər Y-də də eyni olmalıdır.- Təkrarçılıq yeniləmə, əlavə və silmə anomaliyaları yaradır; normallaşdırma hər faktı bir yerdə saxlayır.
- 2NF qismən, 3NF tranzitiv asılılıqları aradan qaldırır; BCNF-də hər müəyyənedici superaçardır.
- Parçalama itkisiz olmalıdır (Hit teoremi); 3NF asılılıqları həmişə qoruya bilir, BCNF isə həmişə yox.
- OLTP üçün 3NF, analitik anbarlar üçün bilərəkdən denormallaşdırılmış «ulduz sxemi» işlədilir.
Özünü yoxla
10 sual. Hər düzgün cavab XP qazandırır.