Bir az da “zanud”luq edək. Gəlin MANY-TO-MANY strukturunun yaradılmasını addım-addım detallı şəkildə keçək. Hazırsan?
MANY-TO-MANY əlaqəsi tələbələrlə kurslar arasında birbaşa bir cədvəldə göstərilə bilməz. Bir tələbə bir neçə kursa yazıla bilər, bir kursda isə eyni anda bir neçə tələbə ola bilər.
Bu problemi həll etmək üçün aralıq enrollments cədvəli yaradırıq, burada hansı tələbə-hansı kurs cütlüyü mövcuddur, onu saxlayırıq. Bu, bizə həm məlumatların bütövlüyünü qorumağa, həm də funksionallığı asanlıqla genişləndirməyə imkan verir, məsələn, qeydiyyat tarixini əlavə edə bilərik.
enrollments cədvəli necə görünür?
Artıq bilirsən ki, enrollments cədvəli students və courses cədvəlləri arasında əsas əlaqə nöqtəsidir. Onun strukturu belədir:
CREATE TABLE enrollments (
enrollment_id SERIAL PRIMARY KEY, -- Unikal ID yazısı
student_id INT REFERENCES students(student_id), -- Xarici açar students cədvəlinə
course_id INT REFERENCES courses(course_id), -- Xarici açar courses cədvəlinə
enrollment_date DATE DEFAULT CURRENT_DATE -- Tələbə kursa nə vaxt yazılıb
);
Hər sətri izah edək:
enrollment_id: Hər yazının unikal identifikatorudur. Axı kursa yazılan hər tələbə unikal olmalıdır.student_id: Hansı tələbənin yazıldığını göstərir. Bu,studentscədvəlinə (sütunstudent_id) istinad edən xarici açardır.course_id: Tələbənin hansı kursa yazıldığını göstərir. Bu sütuncoursescədvəlinə (sütuncourse_id) bağlıdır.enrollment_date: Əlavə faydalı sütundur, qeydiyyat tarixini göstərir.DEFAULT CURRENT_DATEistifadə edirik ki, yazı yaradılarkən avtomatik cari tarixi qeyd etsin.
students və courses cədvəllərinin yaradılması
Davam etməzdən əvvəl əmin olaq ki, artıq students və courses cədvəllərimiz var:
CREATE TABLE students (
student_id SERIAL PRIMARY KEY, -- Tələbənin unikal identifikatoru
name TEXT NOT NULL, -- Tələbənin adı
email TEXT NOT NULL UNIQUE -- Tələbənin emaili, təkrarlanmasın deyə
);
CREATE TABLE courses (
course_id SERIAL PRIMARY KEY, -- Kursun unikal identifikatoru
title TEXT NOT NULL, -- Kursun adı
description TEXT, -- Kursun təsviri
start_date DATE -- Kursun başlama tarixi
);
Burada faydalı detalları əlavə etdik, məsələn, tələbələr üçün unikal email və courses cədvəlində kursun təsviri.
Hər şeyi birləşdiririk
İndi cədvəllərimiz hazırdır, enrollments cədvəlini yaradaq:
CREATE TABLE enrollments (
enrollment_id SERIAL PRIMARY KEY, -- Qeydiyyatın unikal ID-si
student_id INT NOT NULL REFERENCES students(student_id), -- Xarici açar
course_id INT NOT NULL REFERENCES courses(course_id), -- Xarici açar
enrollment_date DATE DEFAULT CURRENT_DATE -- Qeydiyyat tarixi
);
Cədvəllərə məlumat əlavə edirik
Deməli, cədvəllər hazırdır, amma məlumat olmadan darıxırlar. Bir neçə tələbə, kurs və onların qeydiyyatlarını əlavə edək:
Tələbələrin əlavə olunması:
INSERT INTO students (name, email)
VALUES
('Alex Lin', 'alex.lin@example.com'),
('Maria Chi', 'maria.chi@example.com'),
('Otto Song', 'otto.song@example.com');
Kursların əlavə olunması:
INSERT INTO courses (title, description, start_date)
VALUES
('Proqramlaşdırmanın əsasları', 'Yeni başlayan proqramçılar üçün kurs.', '2023-11-01'),
('Verilənlər bazası', 'SQL və relasion verilənlər bazalarını öyrənirik.', '2023-11-15'),
('Veb-inkişaf', 'Saytlar və veb-applikasiyalar yaradılması.', '2023-12-01');
Qeydiyyatların əlavə olunması:
INSERT INTO enrollments (student_id, course_id)
VALUES
(1, 1), -- Alex Lin "Proqramlaşdırmanın əsasları" kursunda
(1, 2), -- Alex Lin "Verilənlər bazası" kursunda
(2, 2), -- Maria Chi "Verilənlər bazası" kursunda
(3, 3); -- Otto Song "Veb-inkişaf" kursunda
Burada student_id və course_id uyğun cədvəllərdəki identifikatorlarla eynidir.
Əlaqələri sorğularla yoxlayırıq
Bütün qeydiyyatları əldə etmək:
SELECT e.enrollment_id, s.name AS student_name, c.title AS course_title, e.enrollment_date
FROM enrollments e
JOIN students s ON e.student_id = s.student_id
JOIN courses c ON e.course_id = c.course_id;
Nəticə:
| enrollment_id | student_name | course_title | enrollment_date |
|---|---|---|---|
| 1 | Alex Lin | Proqramlaşdırmanın əsasları | 2023-11-01 |
| 2 | Alex Lin | Verilənlər bazası | 2023-11-01 |
| 3 | Maria Chi | Verilənlər bazası | 2023-11-01 |
| 4 | Otto Song | Veb-inkişaf | 2023-11-01 |
Özün üçün tapşırıq
Bir neçə tələbə və kurs əlavə etməyə çalış, sonra onları enrollments cədvəlinə yaz. Məsələn, "Maşın öyrənməsi" adlı kurs əlavə et və ora 1-2 tələbə qeydiyyatdan keçir. Nəticəni yoxlamaq üçün yuxarıdakı sorğudan istifadə et.
Mümkün tipik səhvlər
Xarici açarlarla və aralıq cədvəllərlə işləyərkən tez-tez rast gəlinən bəzi tələlər var:
Ana cədvəldə yazı yoxdur: Əgər
enrollmentscədvəlinəstudent_idvə yacourse_idəlavə etməyə çalışsan, amma onlarstudentsvə yacoursescədvəllərində yoxdursa, səhv alacaqsan. Xarici açar buna ciddi nəzarət edir.Məlumatların bütövlüyünün pozulması silinmə zamanı: Əgər artıq
enrollmentscədvəlində istifadə olunan tələbə və ya kursu silsən, ammaON DELETE CASCADEqurulmayıbsa, bu səhvə səbəb olacaq.Yazıların təkrarlanması: Əmin ol ki, bir tələbəni eyni kursa bir neçə dəfə əlavə etmirsən, əgər bu biznes loqikasında nəzərdə tutulmayıbsa.
İndi artıq tələbələrlə kurslar arasında MANY-TO-MANY əlaqəsini PostgreSQL-də qurmaq üçün işlək modelin var. Bu struktur real tətbiqlərdə, məsələn, tədris idarəetmə sistemlərində, CRM-lərdə və bir çox başqa yerdə çox istifadə olunur. Növbəti dərsə keç!
GO TO FULL VERSION