IlmHamroh
JavaScript Full-stack/26-qism. SQL va PostgreSQL5/64-dars19 daqiqa
Mundarija (36)

Relatsion model: ma'lumot jadvallarda, bog'lanish kalitlar orqali

Qisqacha: Relatsion model — ma'lumotni jadvallarda saqlash usuli. Har jadval bitta turdagi narsani (foydalanuvchi, vazifa) tasvirlaydi, har qator — bitta shunday narsa, har ustun — uning bitta xususiyati. Jadvallar bir-biriga ko'rsatkich bilan emas, kalitlar bilan bog'lanadi: vazifa qatorida egasining id si yoziladi. Bu g'oya 1970-yildan beri ishlaydi va PostgreSQL, MySQL, SQLite — hammasi shu modelda qurilgan.

Bu darsda

  • Jadval (relation), qator, ustun va sxema nima ekanini o'z so'zlaringiz bilan tushuntira olasiz.
  • Birlamchi kalit (primary key) va tashqi kalit (foreign key) nima uchun kerakligini va qanday ishlashini aytasiz.
  • JSON'dagi ichma-ich ma'lumotni ikkita bog'langan jadvalga ajrata olasiz.
  • Relatsion algebraning uchta asosiy amalini (tanlash, proyeksiya, birlashtirish) taniysiz.
  • Jadval nega "tartibsiz to'plam" ekanini va bu qanday xatolarga olib kelishini bilasiz.

Oldin bilishingiz kerak: Nega ma'lumotlar bazasi, Massiv: yaratish va elementga murojaat, Obyekt: kalit-qiymat juftliklari.

1. Nega bu kerak?

Nega ma'lumotlar bazasi darsida JSON faylni 10 ta jarayon bir vaqtda yozganda u buzilib, 1 000 vazifadan birortasi ham qolmaganini ko'rdik. Baza esa 1 000 tasini ham saqladi. Endi savol: bazada ma'lumot qanday shaklda turadi?

vazifalar ilovasida (17–22-qismlar) har vazifa shunday obyekt edi: { id, matn, bajarildi }. Endi ilovani ko'p foydalanuvchili qilamiz. Birinchi xayolga keladigan yo'l — har vazifaga egasini ham yozib qo'yish:

json
[
  { "id": 5, "matn": "Ingliz tili: 20 ta yangi so'z",
    "egasi": { "ism": "Dilnoza Rahimova",
               "email": "dilnoza@example.com" } },
  { "id": 16, "matn": "Bozordan meva olish",
    "egasi": { "ism": "Dilnoza Rahimova",
               "email": "dilnoza@example.com" } }
]

Dilnoza'ning 6 ta vazifasi bor — demak uning ismi va emaili 6 marta yozilgan. U emailini almashtirdi. Endi 6 joyni topib, 6 joyda o'zgartirish kerak. Bittasi esdan chiqsa — bazada bitta odamning ikki xil emaili paydo bo'ladi. Qaysi biri to'g'ri? Hech kim bilmaydi.

Relatsion model bu muammoni oddiy qoida bilan hal qiladi: har fakt bitta joyda yoziladi. Dilnoza'ning emaili — foydalanuvchilar jadvalida, bitta qatorda. Vazifalarda esa faqat uning raqami (2) turadi. Email o'zgarsa — bitta joy o'zgaradi.

Hayotiy o'xshatish: maktab jurnali. Jurnalning birinchi sahifasida o'quvchilar ro'yxati — tartib raqami, ism, tug'ilgan sana. Har fan sahifasida esa o'quvchining ismi qayta yozilmaydi, faqat tartib raqami bo'yicha baho qo'yiladi. O'quvchi familiyasini o'zgartirsa, bitta sahifa tuzatiladi.

2. Jadval, qator va ustun

2.1 Jadval — bitta turdagi narsalar to'plami

1970-yilda IBM xodimi Edgar Codd "A Relational Model of Data for Large Shared Data Banks" maqolasini chop etdi. Unda ma'lumotni matematik munosabat (relation) sifatida saqlash taklif qilingan. Kundalik tilda biz uni jadval (table) deymiz. "Relatsion" so'zi shundan.

Jadval — bir turdagi narsalar ro'yxati. foydalanuvchilar jadvalida faqat foydalanuvchilar, vazifalar jadvalida faqat vazifalar. Kanon bazamizdagi foydalanuvchilar jadvalining birinchi uch qatori:

sql
SELECT id, ism, email FROM foydalanuvchilar WHERE id <= 3 ORDER BY id;

Natija:

text
 id |       ism        |        email
----+------------------+---------------------
  1 | Aziz Karimov     | aziz@example.com
  2 | Dilnoza Rahimova | dilnoza@example.com
  3 | Sardor Tursunov  | sardor@example.com
(3 rows)

SELECT — "jadvaldan ma'lumot ber" buyrug'i. Hozir uni o'qib tushunsangiz yetarli: "foydalanuvchilar dan id, ism, email ustunlarini ol, id 3 dan katta bo'lmaganlarini, id bo'yicha tartiblab". Yozishni SELECT va WHERE darsida o'rganamiz. Darsdagi har natija haqiqiy: kanon bazasida (PostgreSQL 18.6) yoki uning nusxasida 17.6-bob ishga tushirilgan. O'zingiz PostgreSQL o'rnatish va ulanish darsidan keyin takrorlay olasiz.

Pastdagi (3 rows) — psql (Postgres'ning terminal dasturi) qo'shgan izoh: "3 ta qator".

2.2 Qator va ustun

  • Qator (row) — bitta narsa: bitta foydalanuvchi, bitta vazifa. Nazariyada uni kortej (tuple) deyishadi. JS'dagi bitta obyektga o'xshaydi.
  • Ustun (column) — barcha qatorlarda bor bo'lgan bitta xususiyat: ism, email. Nazariyada — atribut (attribute). JS obyektidagi kalitga o'xshaydi.
Nazariyada Kundalik nomi JS'dagi o'xshashi
relation jadval (table) obyektlar massivi
tuple qator (row) bitta obyekt
attribute ustun (column) obyekt kaliti
domain ustun turi qiymat turi

O'xshashlik to'liq emas — bitta muhim farq bor. JS massividagi obyektlar istalgan shaklda bo'lishi mumkin: birida email bor, birida yo'q, birida email son. Jadvalda esa har qatorda aynan bir xil ustunlar bor va har ustunning turi qat'iy. Qiymat noma'lum bo'lsa, ustun yo'qolmaydi — unga maxsus NULL ("qiymat yo'q") yoziladi. NULL ni NULL mantiqi darsida chuqur ko'ramiz.

2.3 Bitta katakda — bitta qiymat

Relatsion modelning yana bir qoidasi: qator va ustun kesishgan joyda (katakda) bitta qiymat turadi. Ro'yxat, ichma-ich obyekt emas. vazifalar jadvalining bir qismi:

sql
SELECT id, egasi_id, bajarildi FROM vazifalar WHERE id <= 4;

Natija:

text
 id | egasi_id | bajarildi
----+----------+-----------
  1 |        1 | f
  2 |        1 | t
  3 |        5 | t
  4 |        6 | t
(4 rows)

t — true, f — false (psql mantiqiy qiymatni shunday qisqa ko'rsatadi). E'tibor bering: vazifada egasining ismi yo'q. Faqat egasi_id — egasining raqami. Ism kerak bo'lsa, foydalanuvchilar jadvalidan shu raqam bo'yicha topiladi.

Tekshirib ko'ring: Vazifaga bir nechta teg (#oila, #bozor) kerak bo'lsa, ularni bitta katakka "oila,bozor" qilib yozsa bo'ladimi? Qoida nima deydi?

Javob

Yozish texnik jihatdan mumkin — Postgres matnni qabul qiladi. Lekin bu "bitta katakda bitta qiymat" qoidasini buzadi: endi oila tegli vazifalarni qidirish uchun matn ichidan izlash kerak bo'ladi va oila so'zi oilaviy ichida ham topiladi. Relatsion yechim — teglar uchun alohida jadval. Uni Normalizatsiya va UPSERT va MERGE darslarida quramiz.

3. Sxema — jadvallarning "chizmasi"

3.1 Sxema nima

Sxema (schema) — bazadagi jadvallar, ularning ustunlari, turlari va qoidalari tavsifi. Uyning chizmasi kabi: qaysi xona qayerda, qaysi eshik qayerga ochiladi. Ma'lumot esa — uyda yashayotgan odamlar.

Relatsion bazada sxema ma'lumotdan oldin yaratiladi. Avval "vazifada matn bor, u matn turida va bo'sh bo'lmaydi" deyiladi. Keyin qator qo'shiladi. Sxemaga mos kelmagan qatorni baza qabul qilmaydi. Buni yozishda sxema (schema-on-write) deyishadi. JSON faylda esa istalgan narsa yoziladi, tekshiruv o'qiyotgan kodga qoladi (o'qishda sxema, schema-on-read).

3.2 Sxema bazaning o'zida saqlanadi

Qiziq tomoni: Postgres sxemani ham jadvallarda saqlaydi. SQL standartida bunga information_schema degan maxsus bo'lim bor. Undan vazifalar jadvalining ustunlarini so'raymiz:

sql
SELECT column_name, data_type, is_nullable
FROM information_schema.columns
WHERE table_name = 'vazifalar'
ORDER BY ordinal_position;

Natija:

text
   column_name   |        data_type         | is_nullable
-----------------+--------------------------+-------------
 id              | bigint                   | NO
 egasi_id        | bigint                   | NO
 matn            | text                     | NO
 bajarildi       | boolean                  | NO
 yaratilgan_vaqt | timestamp with time zone | NO
(5 rows)

Har ustunning turi bor: bigint — katta butun son, text — matn, boolean — ha/yo'q, timestamp with time zone — vaqt nuqtasi. is_nullable = NO — "bu ustun bo'sh bo'lishi mumkin emas". Turlarni PostgreSQL ma'lumot turlari darsida birma-bir o'rganamiz.

Shuni eslab qoling: bazaga "sendagi jadvallar qanday?" deb savol bersa bo'ladi. Admin vositalar, ORM'lar, migratsiya dasturlari aynan shunday ishlaydi.

Maslahat: Postgres'da "sxema" so'zining ikkinchi ma'nosi ham bor — jadvallarni guruhlaydigan "papka" (namespace): public.vazifalar, hisobot.vazifalar. Uni CREATE TABLE va cheklovlar darsida ko'ramiz. Hozir "sxema = tuzilma tavsifi" ma'nosida ishlatamiz.

4. Kalitlar: qatorni topish va jadvallarni bog'lash

4.1 Primary key — qatorning "pasporti"

Jadvalda ikkita Aziz Karimov bo'lishi mumkin. Ismi bo'yicha qaysi biri ekanini ajratib bo'lmaydi. Har qatorni aniq topish uchun birlamchi kalit (primary key, PK) kerak — har qatorda noyob va bo'sh bo'lmaydigan qiymat.

foydalanuvchilar jadvalida PK — id ustuni: 1, 2, 3, … Ikki qatorda bir xil id bo'lolmaydi, id siz qator bo'lolmaydi. Buni ilova kodi emas, bazaning o'zi kuzatadi. Pasport raqami kabi: ism takrorlanadi, pasport raqami — yo'q.

PK nima bo'lishi kerak — tartib raqami, email yoki UUID — alohida katta savol. Uni Primary key tanlovi darsida o'lchovlar bilan hal qilamiz.

4.2 Foreign key — boshqa jadvalga ishora

vazifalar.egasi_id ustunida foydalanuvchining id si turadi. Bunday ustun — tashqi kalit (foreign key, FK): boshqa jadvalning PK siga ishora qiluvchi qiymat. "Tashqi" — chunki u tashqaridagi (boshqa) jadvalning kalitini saqlaydi.

FK oddiy son ustunidan nimasi bilan farq qiladi? Baza uni tekshiradi. Mavjud bo'lmagan 99-foydalanuvchiga vazifa yozishga urinib ko'ramiz:

sql
INSERT INTO vazifalar (egasi_id, matn) VALUES (99, 'Yetim vazifa');

Natija:

text
ERROR:  insert or update on table "vazifalar" violates foreign key constraint "vazifalar_egasi_id_fkey"
DETAIL:  Key (egasi_id)=(99) is not present in table "foydalanuvchilar".

Tarjimasi: "vazifalar jadvaliga qo'shish vazifalar_egasi_id_fkey tashqi kalit cheklovini buzadi. Batafsil: (egasi_id)=(99) kaliti foydalanuvchilar jadvalida yo'q." Ya'ni egasiz ("yetim") vazifa bazaga kira olmaydi. INSERT — qator qo'shish buyrug'i (INSERT va RETURNING darsida). Xatoni biz kanon bazasining nusxasida ishga tushirib oldik (PostgreSQL 17.6).

vazifalar_egasi_id_fkey — cheklovning nomi. Postgres nomni <jadval>_<ustun>_<tur> andozasida beradi. fkey — foreign key, pkey — primary key.

4.3 Kalitlar ham bazada yozilgan

Jadvaldagi kalit va boshqa qoidalar ro'yxatini ham so'rash mumkin. pg_constraint — Postgres'ning o'z katalogi (information_schema ning Postgres'ga xos, batafsilroq "qo'shnisi"):

sql
SELECT conname, contype FROM pg_constraint
WHERE conrelid = 'vazifalar'::regclass
  AND contype IN ('p', 'f', 'c')
ORDER BY conname;

Natija:

text
         conname         | contype
-------------------------+---------
 vazifalar_egasi_id_fkey | f
 vazifalar_matn_check    | c
 vazifalar_pkey          | p
(3 rows)

p — primary key, f — foreign key, c — check (qiymat qoidasi, masalan "matn 1–100 belgi"). Tashqi kalitning to'liq ta'rifi esa shunday:

text
FOREIGN KEY (egasi_id) REFERENCES foydalanuvchilar(id) ON DELETE CASCADE

O'qilishi: "egasi_id — foydalanuvchilar(id) ga ishora; foydalanuvchi o'chirilsa, uning vazifalari ham o'chsin (CASCADE)". O'chirishdagi variantlarni Foreign key va referential actions darsida solishtiramiz.

4.4 Ikkala jadval rasmda

Ikki jadval va ularning bog'lanishini diagrammada ko'ring. Chiziq oxiridagi belgilar: || — "aynan bitta", o{ — "nol yoki ko'p":

erDiagram
  foydalanuvchilar ||--o{ vazifalar : "egasi_id"
  foydalanuvchilar {
    bigint id PK
    text email
    text ism
  }
  vazifalar {
    bigint id PK
    bigint egasi_id FK
    text matn
    boolean bajarildi
  }

Nimaga qarang: o'q vazifalar dan foydalanuvchilar ga emas, kalit orqali. Har vazifaning aynan bitta egasi bor, foydalanuvchida esa nol yoki ko'p vazifa bo'lishi mumkin. Shahnoza'da hozircha bitta ham vazifa yo'q — bu ham to'g'ri holat. Bunday diagrammani ER modellash va diagrammalar darsida o'zingiz chizasiz.

Tekshirib ko'ring: Nega vazifalar jadvaliga egasi_ism ustuni qo'shmadik? Axir har so'rovda ismni boshqa jadvaldan olish noqulay emasmi?

Javob

Ism foydalanuvchilar da allaqachon bor. Uni vazifaga ham yozsak — bitta fakt ikki joyda turadi. Dilnoza ismini o'zgartirsa, 6 ta vazifada eski ism qoladi («Nega bu kerak?» bo'limidagi muammo qaytadi). Ismni boshqa jadvaldan olish esa bitta birlashtirish amali — bazalar buni juda tez bajaradi. Takrorlashga ongli ravishda borish (tezlik uchun) ham bor, lekin u alohida qaror: Denormalizatsiya va hisoblangan maydonlar.

5. Relatsion algebra: jadvaldan jadval yasash

5.1 G'oya

Codd modelning ikkinchi yarmi — jadvallar ustida amallar. Har amal bir yoki ikki jadvalni oladi va yangi jadval qaytaradi. Sonlar arifmetikasiga o'xshaydi: 2 + 3 dan yana son chiqadi, uni yana qo'shish mumkin. Jadvaldan ham yana jadval chiqadi — amallarni zanjir qilib ulash mumkin.

Bu g'oyaning nomi — relatsion algebra. Darsda uchta asosiy amalni ko'ramiz. Har birining yonida SQL'dagi mos qismi:

Amal Belgi Nima qiladi SQL'da
tanlash (selection) σ kerakli qatorlarni qoldiradi WHERE
proyeksiya (projection) π kerakli ustunlarni qoldiradi SELECT ro'yxati
birlashtirish (join) ⋈ ikki jadvalni kalit bo'yicha ulaydi JOIN

Bular yonida yana to'plam amallari bor: birlashma (∪), ayirma (−), kesishma (∩). Ularni To'plam amallari darsida ko'ramiz.

5.2 Tanlash va proyeksiya

"Ro'yxatdan o'tgan vaqti 20-sentabrdan oldin bo'lgan foydalanuvchilarning faqat ismi" — bu ikki amal: avval qatorlarni tanlash (σ), keyin bitta ustunni qoldirish (π):

sql
SELECT ism FROM foydalanuvchilar WHERE yaratilgan_vaqt < '2026-09-20';

Natija:

text
       ism
------------------
 Aziz Karimov
 Dilnoza Rahimova
 Sardor Tursunov
 Madina Yusupova
(4 rows)

8 qatorlik, 4 ustunli jadvaldan 4 qatorlik, 1 ustunli jadval chiqdi. Natija ham jadval — ustiga yana amal qo'llash mumkin.

5.3 Birlashtirish

Endi asosiy savol: vazifa matni va egasining ismi bitta natijada kerak. Ular ikki jadvalda. Birlashtirish (JOIN) ularni vazifalar.egasi_id = foydalanuvchilar.id sharti bo'yicha ulaydi:

sql
SELECT f.ism, v.matn
FROM foydalanuvchilar f
JOIN vazifalar v ON v.egasi_id = f.id
WHERE v.id <= 3;

Natija:

text
      ism       |                       matn
----------------+--------------------------------------------------
 Aziz Karimov   | JavaScript kursining 26-qismini boshlash #o'qish
 Aziz Karimov   | Postgres'ni Docker'da ko'tarish #o'qish #docker
 Javohir Olimov | Mijozga taklifnoma yuborish #ish
(3 rows)

f va v — jadvallarning qisqa taxallusi. «Nega bu kerak?» bo'limidagi JSON'da ism har vazifada qayta yozilgan edi. Bu yerda ism bitta joyda turibdi, natijada esa har vazifa yonida chiqdi. Takrorlash saqlashda emas — faqat so'rov natijasida. Birlashtirishning hamma turlarini JOIN'lar darsida o'rganamiz.

5.4 Deklarativ: "nima", "qanday" emas

So'rovda biz qaysi indeksdan foydalanish, qaysi jadvalni avval o'qish, qatorlarni qanday solishtirishni yozmadik. Faqat nima kerakligini aytdik. "Qanday" ni bazaning o'zi tanlaydi. Bu SQL'ning eng kuchli tomoni va uni SQL tili va buyruq turlari darsida chuqurroq ochamiz.

Ko'rsatkichlar yo'qligi ham shu g'oyaning bir qismi. 1960-yillardagi bazalarda (IBM IMS kabi iyerarxik modellar) yozuvlar bir-biriga "diskdagi manzil" bilan bog'langan edi. Ma'lumotni olish uchun dastur o'sha yo'llardan yurishi kerak edi. Relatsion modelda bog'lanish faqat qiymat orqali: egasi_id = 2. Shu sabab istalgan savolni oldindan rejalashtirilmagan yo'l bilan ham berish mumkin.

Tekshirib ko'ring: "Sardor bajargan vazifalar matni" so'rovida qaysi relatsion amallar bor?

Javob

Tanlash (σ) — egasi_id = 3 va bajarildi shartlari bo'yicha qatorlarni qoldirish. Proyeksiya (π) — faqat matn ustunini qoldirish. Agar shartda Sardor'ning ismi ishlatilsa (raqami emas), birlashtirish (⋈) ham kerak bo'ladi — ism foydalanuvchilar da, vazifa vazifalar da. Kanon bazasida bu so'rov 3 qator qaytaradi: "Moy almashtirish #mashina", "Hovlidagi daraxtlarni oqlash #uy", "Futbol: payshanba 20:00 #sport".

6. Jadval — tartibsiz to'plam

6.1 Qatorlar tartibi kafolatlanmagan

Matematikada munosabat — to'plam. To'plamda elementlar tartibi yo'q. Shuning uchun SQL ham ORDER BY siz qatorlar tartibini kafolatlamaydi:

sql
SELECT bajarildi FROM vazifalar LIMIT 5;

Natija:

text
 bajarildi
-----------
 f
 t
 t
 t
 t
(5 rows)

Bu safar qatorlar qo'shilgan tartibda chiqdi. Lekin bu tasodif, va'da emas. Jadval yangilangandan keyin, katta jadvalda yoki boshqa reja tanlanganda tartib o'zgarishi mumkin. Qoida: tartib kerak bo'lsa — doim ORDER BY yozing (ORDER BY, LIMIT va OFFSET darsida).

6.2 Takrorlar: SQL to'plam emas, "xalta"

Bu yerda nazariya va amaliyot ajraladi. Codd'ning to'plamida bir xil ikkita qator bo'lmaydi. SQL esa takrorlarni qoldiradi — uni multiset yoki "xalta" (bag) deyishadi:

sql
SELECT egasi_id FROM vazifalar
WHERE bajarildi AND egasi_id <= 2
ORDER BY egasi_id;

Natija:

text
 egasi_id
----------
        1
        1
        1
        1
        2
        2
        2
(7 rows)

Har bajarilgan vazifa uchun bitta qator: 1 to'rt marta, 2 uch marta takrorlandi (shartsiz so'rov 20 qator qaytaradi). Takrorsiz natija kerak bo'lsa — DISTINCT:

sql
SELECT DISTINCT bajarildi FROM vazifalar;

Natija:

text
 bajarildi
-----------
 f
 t
(2 rows)

40 qatordan 2 ta noyob qiymat qoldi. Nega SQL takrorni o'zi olib tashlamaydi? Chunki bu qimmat — har qatorni boshqalari bilan solishtirish kerak. Ko'p savolda esa takror kerak: "nechta bajarilgan vazifa bor?" deganda har vazifa sanaladi.

7. SQL qadami: vazifalar bazasining birinchi rasmi

Bu darsda vazifalar bazasiga hali hech narsa yozmaymiz va commit yo'q. Lekin butun qism davomida quradigan sxemaning boshlang'ich qarorini qabul qilamiz.

22-qismdagi frontend'da vazifa uchta maydondan iborat edi: id, matn, bajarildi. Bazada ikkita narsa (entity) paydo bo'ladi:

Jadval Qator — bu Asosiy ustunlar
foydalanuvchilar bitta odam id (PK), email, ism
vazifalar bitta vazifa id (PK), egasi_id (FK), matn, bajarildi

Kanon qarorlari:

  • Jadval nomlari — ko'plikda, kichik harf, so'zlar _ bilan, apostrofsiz: foydalanuvchilar, vazifalar.
  • Har jadvalda id — surrogat PK (ma'nosiz tartib raqami). Nega aynan shunday — Primary key tanlovi.
  • Vazifa egasini nom bilan emas, egasi_id bilan biladi.

Bu jadvallarni CREATE TABLE va cheklovlar darsida haqiqatan yaratamiz. Keyingi darslarda teglar, izohlar va tarix jadvallari qo'shiladi — har biri xuddi shu qoidalar bilan.

8. Ko'p uchraydigan xatolar

8.1 Jadvalni Excel varag'i deb o'ylash

Excel'da qatorlar tartibi saqlanadi, istalgan katakka istalgan narsa yoziladi, bitta ustunda son ham, matn ham bo'ladi. Jadval boshqacha: tartib yo'q, ustun turi qat'iy, har qator bir xil shaklda. "3-qator" degan tushuncha yo'q — qator faqat kalit bo'yicha topiladi.

8.2 Bog'lanishni ism bilan qilish

vazifalar.egasi_ism = 'Dilnoza Rahimova' — xavfli. Ism takrorlanadi va o'zgaradi. Bog'lanish doim o'zgarmas, noyob kalit bilan: egasi_id = 2.

8.3 Bog'lanishni faqat kodda kuzatish

egasi_id ni oddiy son ustuni qilib, "ilova o'zi to'g'ri yozadi" deyish — FK'siz bog'lanish. Ilovada bitta xato yoki foydalanuvchini qo'lda o'chirish — va yetim vazifalar paydo bo'ladi. FK bilan baza bunday qatorni yuqoridagi violates foreign key constraint xatosi bilan rad etadi. Bu holatni Foreign key va referential actions darsida jonli ko'ramiz.

8.4 ORDER BY siz tartibga tayanish

"Oxirgi qo'shilgan vazifa doim oxirida chiqadi" — kichik jadvalda ko'pincha shunday ko'rinadi. Lekin bu kafolat emas. Testlar lokal bazada o'tib, katta bazada tasodifiy buzilsa — sababini topish qiyin.

9. Mashqlar

Mashqlar kurs/mashqlar/26/05-relatsion-model/ da. SQL yechimlarini PostgreSQL o'rnatish va ulanish darsidan keyin o'z bazangizda sinashingiz mumkin.

1-mashq (oson): atamalar

  • Bitta turdagi narsalar to'plami — .
  • Jadvaldagi bitta narsa — .
  • Barcha qatorlarda bor bo'lgan bitta xususiyat — .
  • Har qatorni aniq topish uchun noyob, bo'sh bo'lmaydigan kalit — primary .
  • Boshqa jadvalning PK siga ishora qiluvchi ustun — .
  • SQL'da tanlash (σ) qaysi qismga mos — .
Yechim

Jadval (relation), qator (row, tuple), ustun (column, attribute), primary key, foreign key, WHERE. Proyeksiya (π) — SELECT dagi ustunlar ro'yxati, birlashtirish (⋈) — JOIN.

2-mashq (o'rta): JSON'ni jadvallarga ajrating

«Bahor» oshxonasining buyurtmalari shunday JSON'da saqlangan:

json
[
  { "id": 1, "taom": "osh", "narx": 35000,
    "mijoz": { "ism": "Ali", "telefon": "+998 90 000 00 01" } },
  { "id": 2, "taom": "manti", "narx": 30000,
    "mijoz": { "ism": "Malika", "telefon": "+998 90 000 00 02" } },
  { "id": 3, "taom": "lag'mon", "narx": 28000,
    "mijoz": { "ism": "Ali", "telefon": "+998 90 000 00 01" } }
]

Ikki jadvalga ajrating: jadval nomlari, ustunlari, qaysi ustun PK, qaysi biri FK. Har jadvalning qatorlarini ham yozing. Ali telefonini almashtirsa, nechta katak o'zgaradi — JSON'da va jadvallarda?

Yechim

mijozlar jadvali:

id (PK) ism telefon
1 Ali +998 90 000 00 01
2 Malika +998 90 000 00 02

buyurtmalar jadvali:

id (PK) mijoz_id (FK) taom narx
1 1 osh 35000
2 2 manti 30000
3 1 lag'mon 28000

buyurtmalar.mijoz_id → mijozlar.id. Ali telefonini almashtirsa: JSON'da 2 joy (1- va 3-buyurtma), jadvallarda 1 katak (mijozlar dagi 1-qator). Mijozlar ko'paygani sari farq ham o'sadi: 100 ta buyurtmali mijozda — 100 joy va 1 katak.

Diqqat: telefon raqami — namunaviy, +998 90 000 00 0X ko'rinishida (haqiqiy raqam emas).

3-mashq (qiyin): relatsion algebrani qo'lda bajaring

2-mashqdagi ikki jadval bo'yicha natijani qo'lda (bazasiz) yozing:

  1. σ narx > 29000 (buyurtmalar dan).
  2. π taom — 1-qadam natijasidan.
  3. buyurtmalar ⋈ mijozlar (mijoz_id = id), so'ng π ism, taom.
  4. π mijoz_id — buyurtmalar dan. SQL'da nechta qator chiqadi, to'plam nazariyasida nechta?

Keyin yechim faylidagi SQL bilan solishtiring.

Yechim
  1. Ikki qator: (1, 1, osh, 35000) va (2, 2, manti, 30000).
  2. osh, manti.
  3. (Ali, osh), (Malika, manti), (Ali, lag'mon).
  4. SQL'da 3 qator: 1, 2, 1 — takror qoladi (multiset). To'plamda 2 ta: {1, 2}. SQL'da to'plam natijasi uchun DISTINCT yoziladi.

SQL ko'rinishi (jadvallarni yaratish qismi yechim faylida; CREATE TABLE ni CREATE TABLE va cheklovlar darsida o'rganamiz):

sql
SELECT taom FROM buyurtmalar WHERE narx > 29000 ORDER BY id;
SELECT m.ism, b.taom
FROM buyurtmalar b JOIN mijozlar m ON m.id = b.mijoz_id
ORDER BY b.id;
SELECT mijoz_id FROM buyurtmalar ORDER BY id;
SELECT DISTINCT mijoz_id FROM buyurtmalar ORDER BY mijoz_id;

Natija (PostgreSQL 17.6):

text
 taom
-------
 osh
 manti
(2 rows)

  ism   |  taom
--------+---------
 Ali    | osh
 Malika | manti
 Ali    | lag'mon
(3 rows)

 mijoz_id
----------
        1
        2
        1
(3 rows)

 mijoz_id
----------
        1
        2
(2 rows)

Har natijada ORDER BY bor — aks holda tartib kafolatlanmasdi.

4-mashq: SQL qadami — o'z loyihangiz uchun

Portfolio'ngizdagi biror loyihani oling (masalan, 23-qismdagi portfolio v2: loyihalar, blog postlari, aloqa xabarlari). Undagi 2–3 entity uchun jadval rejasini yozing: jadval nomi (ko'plikda, kichik harf), ustunlar, PK, FK. Kamida bitta FK bo'lsin.

Yechim

Namuna (portfolio):

Jadval Ustunlar Kalitlar
loyihalar id, slug, nom, tavsif PK id
postlar id, slug, sarlavha, matn, chop_vaqti PK id
xabarlar id, ism, email, matn, yuborilgan_vaqt PK id
loyiha_rasmlari id, loyiha_id, fayl PK id, FK loyiha_id → loyihalar.id

Asosiy savol har jadvalda bir xil: "bu fakt boshqa joyda ham yozilganmi?" Masalan, loyiha nomini loyiha_rasmlari ga yozmaymiz — faqat loyiha_id.

10. Real ishda

  • Qayerda: bank tranzaksiyalari, onlayn do'konlar, Click/Payme kabi to'lov tizimlari, davlat xizmatlari — hisob aniq bo'lishi kerak bo'lgan deyarli hamma joyda relatsion baza turadi. Ish e'lonlarida eng ko'p so'raladigan bazalar — PostgreSQL va MySQL.
  • Kod bilan bog'liq: backend kodi jadvallarni JS obyektlariga va aksincha o'giradi. Bu ishni qo'lda (pg drayveri) va ORM bilan qilishni keyingi darslarda ko'ramiz. Qaysi usul bo'lmasin, ichida shu darsdagi jadval, qator va kalitlar turadi.
  • Intervyu savollari: "Primary key va foreign key farqi?", "Nega bitta ma'lumotni ikki joyda saqlash xavfli?", "SQL'da ORDER BY siz tartib kafolatlanadimi?". Kuchli javobda misol bor: email ikki joyda turgan holat.

Xulosa

  • Relatsion model: ma'lumot jadvallarda; jadval — bitta turdagi narsalar, qator — bitta narsa, ustun — bitta xususiyat, katakda — bitta qiymat.
  • Sxema — jadvallar tuzilmasi tavsifi; u ma'lumotdan oldin yaratiladi va bazaning o'zida saqlanadi (information_schema, pg_constraint).
  • Primary key qatorni aniq topadi; foreign key boshqa jadvalga qiymat orqali ishora qiladi va baza uni tekshiradi.
  • Har fakt bitta joyda: ism foydalanuvchilar da, vazifada faqat egasi_id.
  • Relatsion algebra: tanlash (WHERE), proyeksiya (SELECT ro'yxati), birlashtirish (JOIN) — natija doim yana jadval.
  • ORDER BY siz tartib kafolatlanmaydi; SQL takrorlarni qoldiradi, kerak bo'lsa DISTINCT.

Keyingi dars: DB turlari xaritasi va SQL vs NoSQL — relatsiondan tashqari qanday bazalar bor va qachon qaysi biri tanlanadi.

Manbalar

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
Relatsion model: ma'lumot jadvallarda, bog'lanish kalitlar orqali — IlmHamroh