CodeGym /Kurslar /SQL SELF /enrollments cədvəlinin yaradılması – tələbəl...

enrollments cədvəlinin yaradılması – tələbələrlə kursları birləşdiririk

SQL SELF
Səviyyə , Dərs
Mövcuddur

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 studentscourses 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, students cədvəlinə (sütun student_id) istinad edən xarici açardır.
  • course_id: Tələbənin hansı kursa yazıldığını göstərir. Bu sütun courses cədvəlinə (sütun course_id) bağlıdır.
  • enrollment_date: Əlavə faydalı sütundur, qeydiyyat tarixini göstərir. DEFAULT CURRENT_DATE istifadə edirik ki, yazı yaradılarkən avtomatik cari tarixi qeyd etsin.

studentscourses cədvəllərinin yaradılması

Davam etməzdən əvvəl əmin olaq ki, artıq studentscourses 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_idcourse_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:

  1. Ana cədvəldə yazı yoxdur: Əgər enrollments cədvəlinə student_id və ya course_id əlavə etməyə çalışsan, amma onlar students və ya courses cədvəllərində yoxdursa, səhv alacaqsan. Xarici açar buna ciddi nəzarət edir.

  2. Məlumatların bütövlüyünün pozulması silinmə zamanı: Əgər artıq enrollments cədvəlində istifadə olunan tələbə və ya kursu silsən, amma ON DELETE CASCADE qurulmayıbsa, bu səhvə səbəb olacaq.

  3. 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ç!

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION