CodeGym /Kurslar /SQL SELF /Xarici açarlar: FOREIGN KEY

Xarici açarlar: FOREIGN KEY

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

Təsəvvür elə ki, səndə iki cədvəl var: biri tələbələr haqqında məlumat saxlayır, digəri isə kurslar haqqında. Necə düşünürsən, hansı tələbənin hansı kursa yazıldığını necə göstərə bilərik? Tələbələr cədvəlinə bir sütun əlavə edib, onların yazıldığı bütün kursları orada saxlamaq olar, amma bu tez bir zamanda xaosa çevriləcək. Ən yaxşı həllərdən biri — xarici açarlardan istifadə etməkdir!

Xarici açar (FOREIGN KEY) — bu, bir və ya bir neçə sütundan ibarət olan bir sahədir ki, cədvəllər arasında əlaqə yaratmaq üçün istifadə olunur. O, başqa bir cədvəldəki sütuna (adətən PRIMARY KEY) işarə edir və onların arasında istinad bütövlüyünü təmin edir. Yəni, əgər hansısa tələbə kursa yazılıbsa, biz əminik ki, o kurs həqiqətən mövcuddur.

Xarici açarlar:

  • Məlumatların bütövlüyünü qorumağa kömək edir, yəni bir cədvəldəki qeydlər digər cədvəldəki məlumatlara uyğun gəlir.
  • Bazanın başa düşülməsini və məntiqi təşkilini asanlaşdırır.
  • Məlumatların işlənməsini sadələşdirir, təkrarı və səhvləri azaldır.

Həyatdan bir nümunə

Təsəvvür elə bir kitabxana var. books cədvəli kitabların siyahısını, members isə oxucuların siyahısını saxlayır. Kim hansı kitabı götürüb izləmək üçün borrowed_books adlı bir cədvəl yarada bilərik və o, booksmembers cədvəllərinə xarici açarlarla istinad edəcək. Beləliklə, kimsə kitab götürəndə, biz dəqiq bilirik ki, kim idi və hansı kitabı götürdü.

Cədvəllər arasında əlaqə tipləri

Xarici açarlar cədvəllər arasında müxtəlif əlaqələri təsvir etməyə imkan verir. Gəlin əsas üç növü nəzərdən keçirək:

1. "Birə-Bir" əlaqə (ONE-TO-ONE)

Bu ən sadə əlaqədir, burada bir cədvəldəki bir qeyd digər cədvəldəki yalnız bir qeydə uyğun gəlir. Məsələn, users cədvəlində istifadəçilər haqqında məlumat, profiles cədvəlində isə əlavə məlumatlar, məsələn, ünvan və ya şəkil saxlanıla bilər.

ONE-TO-ONE əlaqəsi üçün SQL nümunəsi:

CREATE TABLE users (
    user_id SERIAL PRIMARY KEY,
    username TEXT NOT NULL
);

CREATE TABLE profiles (
    profile_id SERIAL PRIMARY KEY,
    user_id INT UNIQUE REFERENCES users(user_id), -- users.user_id-ə istinad edir
    address TEXT
);

Burada profiles cədvəlindəki user_id sütunu xarici açar kimi çıxış edir və users cədvəlindəki user_id-ə istinad edir.

users cədvəlinin nümunəsi:

user_id - PRIMARY KEY username
1 alice
2 bob
3 charlie

profiles cədvəlinin nümunəsi:

profile_id - PRIMARY KEY user_id - FOREIGN KEY address
1 1 Berlin, Germany
2 2 Paris, France
3 3 Tokyo, Japan

2. "Birə-Çox" əlaqə (ONE-TO-MANY)

Bu ən məşhur əlaqədir. Məsələn, bir müştəri bir neçə sifariş edə bilər. Bu halda customers cədvəli orders cədvəli ilə xarici açar vasitəsilə əlaqələndirilir.

ONE-TO-MANY əlaqəsi üçün SQL nümunəsi:

CREATE TABLE customers (
    customer_id SERIAL PRIMARY KEY,
    name TEXT NOT NULL
);

CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    customer_id INT REFERENCES customers(customer_id),	-- customers.customer_id-ə istinad edir
    order_date DATE NOT NULL
);

orders cədvəlində bir neçə qeyd ola bilər və onlar bir customers cədvəlindəki qeydə istinad edir

customers cədvəlinin nümunəsi:

customer_id - PRIMARY KEY name
1 Alice
2 Bob
3 Charlie

orders cədvəlinin nümunəsi:

order_id - PRIMARY KEY customer_id - FOREIGN KEY order_date
1 1 2024-12-01
2 1 2024-12-05
3 2 2024-12-03
4 3 2024-12-07

3. "Çoxdan-Çoxa" əlaqə (MANY-TO-MANY)

Bəzən bir cədvəldəki bir qeyd digər cədvəldə bir neçə qeydlə əlaqəli ola bilər və əksinə. Məsələn, tələbələr kurslara yazılır, bir kursda isə bir neçə tələbə ola bilər. Bunun üçün adətən aralıq cədvəl yaradılır.

MANY-TO-MANY əlaqəsi üçün SQL nümunəsi:

-- tələbələr
CREATE TABLE students (
    student_id SERIAL PRIMARY KEY,
    name TEXT NOT NULL
);

-- kurslar
CREATE TABLE courses (
    course_id SERIAL PRIMARY KEY,
    title TEXT NOT NULL
);

-- "müəyyən tələbənin müəyyən kursa yazılması"
CREATE TABLE enrollments (
    student_id INT REFERENCES students(student_id), -- tələbənin id-sinə istinad
    course_id INT REFERENCES courses(course_id),	-- kursun id-sinə istinad
    PRIMARY KEY (student_id, course_id)
);

Burada enrollments cədvəli studentscourses cədvəlləri arasında "körpü" rolunu oynayır.

students cədvəlinin nümunəsi:

student_id - PRIMARY KEY name
1 Alice
2 Bob
3 Charlie

courses cədvəlinin nümunəsi:

course_id - PRIMARY KEY title
1 SQL Basics
2 Data Structures
3 Algorithms

enrollments cədvəlinin nümunəsi:

student_id - FOREIGN KEY course_id - FOREIGN KEY
1 1
1 2
2 1
3 3

Xarici açarlardan istifadə etməyin üstünlükləri

  1. Məlumatlar ardıcıl qalır. Əgər xarici açar mövcud olmayan bir qeydə işarə edirsə, PostgreSQL məlumatı əlavə etməyə və ya yeniləməyə icazə verməyəcək.
  2. Cədvəllərlə işləmək asanlaşır. Xarici açarlar cədvəllər arasında məlumatları rahat birləşdirməyə və JOIN kimi mürəkkəb sorğular yazmağa imkan verir.
  3. Avtomatik davranış. Əlaqəli qeydlər silinəndə və ya yenilənəndə nə baş verəcəyini təyin edə bilərsən (məsələn, kaskadlı silmə, NULL qoymaq və s.).

Xarici açar PostgreSQL-də necə görünür?

Cədvəl yaradanda xarici açar üçün sintaksis belədir:

CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    customer_id INT REFERENCES customers(customer_id)   -- xarici açar-istinad
);

Burada:

  • customer_id — xarici açardır.
  • O, customers cədvəlindəki customer_id-ə istinad edir.

Xarici açarı açıq şəkildə FOREIGN KEY ilə də göstərə bilərsən:

CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    customer_id INT,
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

Maraqlı fakt

"Xarici açar" (FOREIGN KEY) termini ilk dəfə 1970-ci illərdə Edgar Codd tərəfindən yaradılmış relasional verilənlər bazası nəzəriyyəsindən gəlib. Maraqlıdır ki, əsas ideya o qədər güclüdür ki, bu gün də müasir verilənlər bazalarının əsas hissəsidir. Kim deyib ki, klassika aktual deyil?

İndi sən başa düşürsən ki, xarici açar nədir və niyə bu qədər vacibdir. Səni hələ qarşıda cədvəl yaradanda onları necə əlavə etmək və kaskad əməliyyatları düzgün istifadə etmək kimi mövzular gözləyir. Amma bu artıq növbəti leksiyalarda olacaq!

2
Tapşırıq
SQL SELF, səviyyə, dərs
Bağlanıb
Xarici açarla cədvəl yaradılması
Xarici açarla cədvəl yaradılması
2
Tapşırıq
SQL SELF, səviyyə, dərs
Bağlanıb
Sifarişlər və müştərilər arasında "Bir-Çoxlara" əlaqəsi
Sifarişlər və müştərilər arasında "Bir-Çoxlara" əlaqəsi
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION