Mundarija (36)
- Bu darsda
- 1. Nega bu kerak?
- 2. Jadval, qator va ustun
- 2.1 Jadval — bitta turdagi narsalar to'plami
- 2.2 Qator va ustun
- 2.3 Bitta katakda — bitta qiymat
- 3. Sxema — jadvallarning "chizmasi"
- 3.1 Sxema nima
- 3.2 Sxema bazaning o'zida saqlanadi
- 4. Kalitlar: qatorni topish va jadvallarni bog'lash
- 4.1 Primary key — qatorning "pasporti"
- 4.2 Foreign key — boshqa jadvalga ishora
- 4.3 Kalitlar ham bazada yozilgan
- 4.4 Ikkala jadval rasmda
- 5. Relatsion algebra: jadvaldan jadval yasash
- 5.1 G'oya
- 5.2 Tanlash va proyeksiya
- 5.3 Birlashtirish
- 5.4 Deklarativ: "nima", "qanday" emas
- 6. Jadval — tartibsiz to'plam
- 6.1 Qatorlar tartibi kafolatlanmagan
- 6.2 Takrorlar: SQL to'plam emas, "xalta"
- 7. SQL qadami: vazifalar bazasining birinchi rasmi
- 8. Ko'p uchraydigan xatolar
- 8.1 Jadvalni Excel varag'i deb o'ylash
- 8.2 Bog'lanishni ism bilan qilish
- 8.3 Bog'lanishni faqat kodda kuzatish
- 8.4 ORDER BY siz tartibga tayanish
- 9. Mashqlar
- 1-mashq (oson): atamalar
- 2-mashq (o'rta): JSON'ni jadvallarga ajrating
- 3-mashq (qiyin): relatsion algebrani qo'lda bajaring
- 4-mashq: SQL qadami — o'z loyihangiz uchun
- 10. Real ishda
- Xulosa
- Manbalar
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
idsi 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:
[
{ "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:
SELECT id, ism, email FROM foydalanuvchilar WHERE id <= 3 ORDER BY id;Natija:
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:
SELECT id, egasi_id, bajarildi FROM vazifalar WHERE id <= 4;Natija:
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:
SELECT column_name, data_type, is_nullable
FROM information_schema.columns
WHERE table_name = 'vazifalar'
ORDER BY ordinal_position;Natija:
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:
INSERT INTO vazifalar (egasi_id, matn) VALUES (99, 'Yetim vazifa');Natija:
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"):
SELECT conname, contype FROM pg_constraint
WHERE conrelid = 'vazifalar'::regclass
AND contype IN ('p', 'f', 'c')
ORDER BY conname;Natija:
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:
FOREIGN KEY (egasi_id) REFERENCES foydalanuvchilar(id) ON DELETE CASCADEO'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
vazifalarjadvaligaegasi_ismustuni 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 (π):
SELECT ism FROM foydalanuvchilar WHERE yaratilgan_vaqt < '2026-09-20';Natija:
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:
SELECT f.ism, v.matn
FROM foydalanuvchilar f
JOIN vazifalar v ON v.egasi_id = f.id
WHERE v.id <= 3;Natija:
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:
SELECT bajarildi FROM vazifalar LIMIT 5;Natija:
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:
SELECT egasi_id FROM vazifalar
WHERE bajarildi AND egasi_id <= 2
ORDER BY egasi_id;Natija:
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:
SELECT DISTINCT bajarildi FROM vazifalar;Natija:
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_idbilan 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:
[
{ "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:
- σ
narx > 29000(buyurtmalardan). - π
taom— 1-qadam natijasidan. buyurtmalar ⋈ mijozlar(mijoz_id = id), so'ng πism, taom.- π
mijoz_id—buyurtmalardan. SQL'da nechta qator chiqadi, to'plam nazariyasida nechta?
Keyin yechim faylidagi SQL bilan solishtiring.
Yechim
- Ikki qator:
(1, 1, osh, 35000)va(2, 2, manti, 30000). osh,manti.(Ali, osh),(Malika, manti),(Ali, lag'mon).- SQL'da 3 qator:
1,2,1— takror qoladi (multiset). To'plamda 2 ta:{1, 2}. SQL'da to'plam natijasi uchunDISTINCTyoziladi.
SQL ko'rinishi (jadvallarni yaratish qismi yechim faylida; CREATE TABLE ni CREATE TABLE va cheklovlar darsida o'rganamiz):
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):
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 (
pgdrayveri) 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 BYsiz 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
foydalanuvchilarda, vazifada faqategasi_id. - Relatsion algebra: tanlash (
WHERE), proyeksiya (SELECTro'yxati), birlashtirish (JOIN) — natija doim yana jadval. ORDER BYsiz tartib kafolatlanmaydi; SQL takrorlarni qoldiradi, kerak bo'lsaDISTINCT.
Keyingi dars: DB turlari xaritasi va SQL vs NoSQL — relatsiondan tashqari qanday bazalar bor va qachon qaysi biri tanlanadi.
Manbalar
- E. F. Codd — A Relational Model of Data for Large Shared Data Banks (1970): https://dl.acm.org/doi/10.1145/362384.362685
- PostgreSQL 18 hujjati — Concepts: https://www.postgresql.org/docs/18/tutorial-concepts.html
- PostgreSQL 18 hujjati — The Information Schema: https://www.postgresql.org/docs/18/information-schema.html
- PostgreSQL 18 hujjati — pg_constraint: https://www.postgresql.org/docs/18/catalog-pg-constraint.html
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!