Məzmuna keç
Educora
Universitet30 dəq18 / 22

Baza layihələndirmə və normallaşdırma

ER modeli qur, əlaqələrin kardinallığını müəyyən et, funksional asılılıqları tap və cədvəlləri addım-addım 1NF, 2NF, 3NF və BCNF-yə qədər parçala.

Özünü yoxla
Bu dərsdə öyrənəcəksən
  • 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.

Tərif
Kardinallıq

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ə biletiikinci cədvəldə UNIQUE xarici açar və ya ümumi əsas açar
1:Nmüştəri — sifarişlər«çox» tərəfdə xarici açar: orders.customer_id
M:Nşagirdlər — kurslariki xarici açarlı aralıq cədvəl: enrollments
Relyasiya bazasında M:N əlaqəsini birbaşa saxlamaq olmur — o, həmişə iki 1:N əlaqəsinə bölünür.

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.

X → Y ⇔ ∀ t₁, t₂ ∈ r : t₁[X] = t₂[X] ⇒ t₁[Y] = t₂[Y]
burada:
  • 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).
SQL
-- 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
Yeniləmə anomaliyası: indi bir kursun iki «müəllimi» var. Normallaşdırılmış bazada ad yalnız courses-də bir dəfə dəyişdirilir.

Normal formalar: 1NF-dən BCNF-yə

FormaQaydaTipik pozuntu
1NFhər xanada tək (atomar) qiymət, təkrarlanan qruplar yoxdur, sətirləri açar ayırırphones = '050…, 055…'
2NF1NF + açar olmayan atribut bütün namizəd açardan asılıdır, onun bir hissəsindən yoxaçar (student_id, course_id), amma student_id → city
3NF2NF + açar olmayan atribut başqa açar olmayan atributdan asılı deyil, yəni tranzitiv asılılıq yoxdurcourse_id → teacher → teacher_phone
BCNFhər qeyri-trivial X → Y üçün X superaçardırteacher → subject, halbuki teacher açar deyil
Nümunə 1: 2NF-yə qədər parçalama

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ər
1) Bütün qiymətlər atomardır, açar var — 1NF ödənir.
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₂) → R₁ ∨ (R₁ ∩ R₂) → R₂
burada:
  • 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₂.

Nümunə 2: 3NF və BCNF arasındakı fərq

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ər
1) Namizəd açarlar: (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.

Tapşırıq

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

Tapşırıq · SQL
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
Tapşırıq

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.

Tapşırıq · SQL
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 → Y funksional 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.

1 / 10
Şagirdlər və kurslar arasındakı M:N əlaqəsi relyasiya bazasında necə qurulur?