Sxema dizayni va butunlik: constraint'lar
lockThis content isn't available in English yetAvailable in: O'zbek
terminal
Hands-on labs
Interactive tasks attached to this lesson — complete them in a real Kubernetes environment and check the result.
terminal
PostgreSQL: majburiy maydonlar va sukut qiymatlar (NOT NULL, DEFAULT)
Osonbolt+10 XP
Hisob jadvalida bo'sh nom va noaniq holat bilan qatorlar paydo bo'lyapti — sxema darajasida to'sish kerak. Ish katalogi: /root/db/. Bazada HAQIQIY PostgreSQL 16 ishlaydi (unix socket, psql -h /tmp -d hn). Checker JONLI tekshiradi: so'rov NATIJASI, katalog holati (pg indexes, pg constraint, pg roles), EXPLAIN (format json) rejasi va ma'lumotning haqiqiy o'zgarishi. ⚠psql ni postgres foydalanuvchisi ostida chaqirish kerak: su postgres -c "psql -h /tmp -d hn -c '...'" yoki -f fayl.sql. ⚠Server root ostida ishlamaydi — shuning uchun barcha psql chaqiruvlari postgres foydalanuvchisi nomidan bajariladi. Vazifa hisob jadvalini yarating: id — PRIMARY KEY (serial) nom — text, NOT NULL holat — text, NOT NULL, sukut qiymati 'faol' yaratilgan — timestamptz, NOT NULL, sukut qiymati now() Muvaffaqiyat mezoni (jonli) Nomsiz qator RAD etiladi; holat va yaratilgan ko'rsatilmasa sukut qiymatlar bilan to'ladi
terminal
PostgreSQL: takrorlanishni to'sish (UNIQUE, ko'p ustunli UNIQUE)
Osonbolt+20 XP
Bir foydalanuvchi bir xil email bilan ikki marta ro'yxatdan o'tyapti; shuningdek bir serverda bir port ikki xizmatga berilgan. Ish katalogi: /root/db/. Bazada HAQIQIY PostgreSQL 16 ishlaydi (unix socket, psql -h /tmp -d hn). Checker JONLI tekshiradi: so'rov NATIJASI, katalog holati (pg indexes, pg constraint, pg roles), EXPLAIN (format json) rejasi va ma'lumotning haqiqiy o'zgarishi. ⚠psql ni postgres foydalanuvchisi ostida chaqirish kerak: su postgres -c "psql -h /tmp -d hn -c '...'" yoki -f fayl.sql. ⚠Server root ostida ishlamaydi — shuning uchun barcha psql chaqiruvlari postgres foydalanuvchisi nomidan bajariladi. Vazifa Ikki jadval yarating: foydalanuvchi: id PK, email text NOT NULL UNIQUE port band: id PK, server id int NOT NULL, port int NOT NULL, va (server id, port) juftligi bo'yicha KO'P USTUNLI UNIQUE ⚠Ikkinchisida har ustun alohida emas, aynan JUFTLIK noyob bo'lishi kerak. Muvaffaqiyat mezoni (jonli) Takroriy email rad etiladi; bir serverda takroriy port rad etiladi, lekin BOSHQA serverda o'sha port qabul qilinadi
terminal
PostgreSQL: qiymat chegaralari (CHECK constraint)
Osonbolt+20 XP
Balans manfiy bo'lib ketyapti va port raqami mumkin bo'lmagan qiymat oladi — bazaning o'zi to'sishi kerak. Ish katalogi: /root/db/. Bazada HAQIQIY PostgreSQL 16 ishlaydi (unix socket, psql -h /tmp -d hn). Checker JONLI tekshiradi: so'rov NATIJASI, katalog holati (pg indexes, pg constraint, pg roles), EXPLAIN (format json) rejasi va ma'lumotning haqiqiy o'zgarishi. ⚠psql ni postgres foydalanuvchisi ostida chaqirish kerak: su postgres -c "psql -h /tmp -d hn -c '...'" yoki -f fayl.sql. ⚠Server root ostida ishlamaydi — shuning uchun barcha psql chaqiruvlari postgres foydalanuvchisi nomidan bajariladi. Vazifa hisob jadvalini yarating: id PK, nom text NOT NULL balans — numeric(12,2), NOT NULL, sukut 0, manfiy bo'lmasligi kerak port — int, 1..65535 oralig'ida bo'lishi kerak email — text, ichida @ belgisi bo'lishi kerak (like bilan tekshiring) Muvaffaqiyat mezoni (jonli) Manfiy balans, chegaradan tashqari port va @ siz email RAD etiladi; to'g'ri qiymatlar qabul qilinadi
terminal
PostgreSQL: bog'liqlik va o'chirish siyosati (FOREIGN KEY, ON DELETE)
Murakkabbolt+30 XP
Server o'chirilganda undagi xizmatlar bilan nima bo'lishi kerak? Jurnal yozuvlari esa saqlanishi, lekin bog'lanish uzilishi kerak. Ish katalogi: /root/db/. Bazada HAQIQIY PostgreSQL 16 ishlaydi (unix socket, psql -h /tmp -d hn). Checker JONLI tekshiradi: so'rov NATIJASI, katalog holati (pg indexes, pg constraint, pg roles), EXPLAIN (format json) rejasi va ma'lumotning haqiqiy o'zgarishi. ⚠psql ni postgres foydalanuvchisi ostida chaqirish kerak: su postgres -c "psql -h /tmp -d hn -c '...'" yoki -f fayl.sql. ⚠Server root ostida ishlamaydi — shuning uchun barcha psql chaqiruvlari postgres foydalanuvchisi nomidan bajariladi. Vazifa Uch jadval yarating: server: id PK, nom text NOT NULL xizmat: id PK, server id int NOT NULL, nom text NOT NULL — server(id) ga FK, on delete cascade jurnal: id PK, server id int (NULL bo'lishi mumkin), xabar text — server(id) ga FK, on delete set null Muvaffaqiyat mezoni (jonli) Mavjud bo'lmagan serverga ishora rad etiladi; server o'chirilganda xizmatlar ham o'chadi, jurnal yozuvi qoladi va server id NULL bo'ladi
terminal
PostgreSQL: to'g'ri tur tanlash (numeric, timestamptz, inet, uuid)
Osonbolt+20 XP
Eski jadvalda hamma narsa text da saqlangan — bu xatolarga va sekin so'rovlarga olib kelyapti. Yangi sxema to'g'ri turlar bilan yoziladi. Ish katalogi: /root/db/. Bazada HAQIQIY PostgreSQL 16 ishlaydi (unix socket, psql -h /tmp -d hn). Checker JONLI tekshiradi: so'rov NATIJASI, katalog holati (pg indexes, pg constraint, pg roles), EXPLAIN (format json) rejasi va ma'lumotning haqiqiy o'zgarishi. ⚠psql ni postgres foydalanuvchisi ostida chaqirish kerak: su postgres -c "psql -h /tmp -d hn -c '...'" yoki -f fayl.sql. ⚠Server root ostida ishlamaydi — shuning uchun barcha psql chaqiruvlari postgres foydalanuvchisi nomidan bajariladi. Vazifa tolov jadvalini yarating: id — uuid, PRIMARY KEY, sukut qiymati gen random uuid() summa — numeric(12,2), NOT NULL (pul!) vaqt — timestamptz, NOT NULL, sukut now() mijoz ip — inet muvaffaqiyatli — boolean, NOT NULL, sukut false Muvaffaqiyat mezoni (jonli) Ustun turlari aynan talab qilinganday; noto'g'ri IP rad etiladi; uuid avtomatik generatsiya qilinadi
terminal
PostgreSQL: holat ustuni (CHECK ro'yxati va ENUM farqi)
Osonbolt+20 XP
holat ustuniga ilova ba'zan active, ba'zan Active, ba'zan enabled yozib yuboryapti — ro'yxat qat'iy cheklanishi kerak. Ish katalogi: /root/db/. Bazada HAQIQIY PostgreSQL 16 ishlaydi (unix socket, psql -h /tmp -d hn). Checker JONLI tekshiradi: so'rov NATIJASI, katalog holati (pg indexes, pg constraint, pg roles), EXPLAIN (format json) rejasi va ma'lumotning haqiqiy o'zgarishi. ⚠psql ni postgres foydalanuvchisi ostida chaqirish kerak: su postgres -c "psql -h /tmp -d hn -c '...'" yoki -f fayl.sql. ⚠Server root ostida ishlamaydi — shuning uchun barcha psql chaqiruvlari postgres foydalanuvchisi nomidan bajariladi. Vazifa vazifa jadvalini yarating: id PK, nom text NOT NULL holat — text, NOT NULL, sukut 'navbatda', va FAQAT shu qiymatlar: 'navbatda', 'ishlamoqda', 'tugagan', 'xato' Constraint nomi aynan vazifa holat toifa bo'lsin Muvaffaqiyat mezoni (jonli) Ro'yxatdan tashqari qiymat rad etiladi (katta harfli variant ham); constraint nomlangan; sukut qiymat ishlaydi
terminal
PostgreSQL: hisoblanadigan ustun (GENERATED ALWAYS AS STORED)
Murakkabbolt+30 XP
Hisobotlarda har safar narx miqdor hisoblanmoqda — bu qiymat bazada avtomatik saqlanishi va DOIM to'g'ri bo'lishi kerak. Ish katalogi: /root/db/. Bazada HAQIQIY PostgreSQL 16 ishlaydi (unix socket, psql -h /tmp -d hn). Checker JONLI tekshiradi: so'rov NATIJASI, katalog holati (pg indexes, pg constraint, pg roles), EXPLAIN (format json) rejasi va ma'lumotning haqiqiy o'zgarishi. ⚠psql ni postgres foydalanuvchisi ostida chaqirish kerak: su postgres -c "psql -h /tmp -d hn -c '...'" yoki -f fayl.sql. ⚠Server root ostida ishlamaydi — shuning uchun barcha psql chaqiruvlari postgres foydalanuvchisi nomidan bajariladi. Vazifa buyurtma jadvalini yarating: id PK narx — numeric(12,2), NOT NULL, musbat bo'lishi kerak miqdor — int, NOT NULL, musbat bo'lishi kerak jami — numeric(12,2), generated always as (narx miqdor) stored Muvaffaqiyat mezoni (jonli) jami avtomatik hisoblanadi; unga QO'LDA yozishga urinish rad etiladi; narx yangilanganda jami ham yangilanadi
terminal
PostgreSQL: tabiiy va sun'iy kalit (composite PRIMARY KEY)
Murakkabbolt+30 XP
Ko'p-ko'pga bog'lanish jadvalida (foydalanuvchi va rol) sun'iy id shart emas — juftlikning o'zi kalit bo'lishi kerak. Ish katalogi: /root/db/. Bazada HAQIQIY PostgreSQL 16 ishlaydi (unix socket, psql -h /tmp -d hn). Checker JONLI tekshiradi: so'rov NATIJASI, katalog holati (pg indexes, pg constraint, pg roles), EXPLAIN (format json) rejasi va ma'lumotning haqiqiy o'zgarishi. ⚠psql ni postgres foydalanuvchisi ostida chaqirish kerak: su postgres -c "psql -h /tmp -d hn -c '...'" yoki -f fayl.sql. ⚠Server root ostida ishlamaydi — shuning uchun barcha psql chaqiruvlari postgres foydalanuvchisi nomidan bajariladi. Vazifa Ikki jadval yarating: rol: id PK, nom text NOT NULL UNIQUE foydalanuvchi rol: foydalanuvchi id int NOT NULL, rol id int NOT NULL (rol(id) ga FK, on delete cascade), berilgan timestamptz NOT NULL sukut now() PRIMARY KEY — (foydalanuvchi id, rol id) juftligi (alohida id ustuni BO'LMASIN) Muvaffaqiyat mezoni (jonli) Juftlik takrorlansa rad etiladi; id ustuni yo'q; rol o'chirilganda bog'lanishlar ham o'chadi
terminal
PostgreSQL: takrorlanuvchi ma'lumotni ajratish (normalizatsiya)
Murakkabbolt+30 XP
Bitta yassi jadvalda server nomi har xizmat qatorida TAKRORLANADI — nomni o'zgartirish uchun o'nlab qatorni yangilash kerak. Ish katalogi: /root/db/. Bazada HAQIQIY PostgreSQL 16 ishlaydi (unix socket, psql -h /tmp -d hn). Checker JONLI tekshiradi: so'rov NATIJASI, katalog holati (pg indexes, pg constraint, pg roles), EXPLAIN (format json) rejasi va ma'lumotning haqiqiy o'zgarishi. ⚠psql ni postgres foydalanuvchisi ostida chaqirish kerak: su postgres -c "psql -h /tmp -d hn -c '...'" yoki -f fayl.sql. ⚠Server root ostida ishlamaydi — shuning uchun barcha psql chaqiruvlari postgres foydalanuvchisi nomidan bajariladi. Vazifa Yassi xizmat yassi(id, server nom, server muhit, xizmat nom, port) jadvali berilgan (SEED to'ldirgan). Uni normallashtiring: server(id, nom UNIQUE NOT NULL, muhit NOT NULL) yarating va yassidan NOYOB serverlarni ko'chiring xizmat(id, server id FK NOT NULL, nom NOT NULL, port NOT NULL) yarating va xizmatlarni to'g'ri server id bilan ko'chiring ⚠Ma'lumot YO'QOLMASLIGI kerak: 3 server va 5 xizmat. Muvaffaqiyat mezoni (jonli) server da 3 noyob qator, xizmat da 5 qator; har xizmat to'g'ri serverga bog'langan; FK mavjud
terminal
PostgreSQL: to'liq sxema butunlik bilan (B temasi yakuni)
Murakkabbolt+30 XP
Yangi mikroservis uchun to'liq sxema: barcha butunlik qoidalari baza darajasida muhrlanadi. Ish katalogi: /root/db/. Bazada HAQIQIY PostgreSQL 16 ishlaydi (unix socket, psql -h /tmp -d hn). Checker JONLI tekshiradi: so'rov NATIJASI, katalog holati (pg indexes, pg constraint, pg roles), EXPLAIN (format json) rejasi va ma'lumotning haqiqiy o'zgarishi. ⚠psql ni postgres foydalanuvchisi ostida chaqirish kerak: su postgres -c "psql -h /tmp -d hn -c '...'" yoki -f fayl.sql. ⚠Server root ostida ishlamaydi — shuning uchun barcha psql chaqiruvlari postgres foydalanuvchisi nomidan bajariladi. Vazifa Ikki jadval yarating: mijoz : id uuid PK sukut gen random uuid(); email text NOT NULL UNIQUE va @ bo'lishi shart; yaratilgan timestamptz NOT NULL sukut now() buyurtma : id serial PK; mijoz id uuid NOT NULL — mijoz(id) ga FK on delete cascade; summa numeric(12,2) NOT NULL musbat; holat text NOT NULL sukut 'yangi' va faqat uchta qiymat (yangi, tolandi, bekor); soliq numeric(12,2) generated (summa 0.12) stored Muvaffaqiyat mezoni (jonli) Noto'g'ri email, manfiy summa, noma'lum holat va mavjud bo'lmagan mijoz RAD etiladi; soliq avtomatik hisoblanadi; mijoz o'chirilsa buyurtmalari ham o'chadi
