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, books və members 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 students və courses 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
- 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.
- 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ə
JOINkimi mürəkkəb sorğular yazmağa imkan verir. - 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ə,
NULLqoymaq 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,
customerscədvəlindəkicustomer_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!
GO TO FULL VERSION