Vibecoding · 18-dars · 9-sinf (Backend & Data Track)
Fan: Vibecoding · Backend Muhandislik Kohorta: 9-sinf Junior Vibecoder Format: Birlashtirilgan Deep-Dive (80 daqiqa)

Ma'lumotlar Bazasi va SQL: Relyatsion Arxitektura va Xavfsizlik

Oddiy fayllar (JSON, CSV) millionlab foydalanuvchilar bir vaqtda yozganda buziladi, xotiradan toshib ketadi va ma'lumotlarni yo'qotadi. Bugungi darsda zamonaviy IT infratuzilmaning yuragi bo'lgan Relyatsion Ma'lumotlar Bazasi (RDBMS), ACID tamoyillari, SQL so'rovlari, B-Tree indekslar va eng xavfli hujumlardan biri — SQL Injectiondan 100% himoyalanishni o'rganamiz.

Kirish · SQL Dvigateli Nima va O'rnatish

SQL Dvigateli: Arxitektura, O'rnatish va Birinchi So'rov

1 · SQL Dvigateli Nima?

  • Oddiy fayl emas: Baza — bu SQL so'rovlarni tahlil qiluvchi (AST parser), xotirani boshqaruvchi va qoidalarni tekshiruvchi maxsus dasturdir.
  • Serverless SQLite: Portlar (5432/3306) to'qnashuvi yo'q, parol yo'q, fon xizmati yo'q. Butun baza bitta shop.db faylida yashaydi.
  • Dunyo standarti: Barcha iPhone, Android, Google Chrome, Windows va Airbus samolyotlarida SQLite o'rnatilgan.

2 · 30 Soniyada O'rnatish

  • Windows: Terminalda winget install SQLite.SQLite yoki bir zumda: python -m sqlite3 shop.db
  • macOS / Linux: Zavoddan o'rnatilgan! Terminalni ochib sqlite3 shop.db buyrug'ini bering.
  • Interaktiv Simulyator (0 soniya): lab/index.html (ichki baza dvigateli, kvestlar va B-Tree).
  • Brauzerda zaxira: sqlime.org (onlayn WebAssembly).

3 · Qoidalar va Birinchi So'rov

  • Ishga tushirish va Sozlash:
    sqlite3 shop.db
    .headers on
    .mode table
  • Birinchi SQL So'rov:
    SELECT 'Salom SQL!' AS xabar, 2026 AS yil;
  • Oltin qoida: SQL buyruqlari nuqta-vergul (;) bilan tugaydi. CLI buyruqlari esa nuqta bilan boshlanadi (.tables, .quit).
Ma'lumotlar yaxlitligi

Nega JSON Fayl Emas? ACID Standarti

JSON/CSV fayllarning halokatli cheklovlari

  • Race Condition: 2 kishi bir vaqtda faylga yozsa, birining ma'lumoti butunlay o'chib ketadi.
  • Xotira to'lishi: 500 MB fayldan 1 ta foydalanuvchini topish uchun butun fayl RAMga yuklanadi.
  • Munosabatlar yo'qligi: Foydalanuvchi o'chsa, uning xaridlari faylda yetim (ghost) bo'lib qoladi.

RDBMS va ACID kafolatlari (PostgreSQL, SQLite)

  • A — Atomicity: Tranzaksiya yo 100% bajariladi, yoki butunlay bekor bo'ladi (ROLLBACK).
  • C — Consistency: Sxema qoidalari (NOT NULL, CHECK, FK) hech qachon buzilmaydi.
  • I — Isolation: Parallel so'rovlar bir-birining oraliq holatini ko'rmaydi.
  • D — Durability: Server o'chib qolsa ham, tasdiqlangan (COMMIT) ma'lumot diskda saqlanib qoladi.
Relyatsion tuzilma

Jadvallar, Primary Key va Foreign Key

Primary Key (Birlamchi Kalit — PK)

  • Unikal identifikator: Har bir satrni yagona qilib ajratib turadi (masalan: `id SERIAL` yoki `UUID`).
  • Takrorlanmaslik kafolati: Baza bir xil PK ga ega ikki yozuv kiritilishiga yo'l qo'ymaydi.
  • Tezkor qidiruv: PK avtomatik B-Tree indeks bilan himoyalanadi.

Foreign Key (Tashqi Kalit — FK)

  • Jadvallararo ko'prik: Bir jadvaldagi satrni boshqa jadval PK si bilan bog'laydi.
  • 1-to-Many munosabat: 1 ta mijoz (`users.id`) 100 ta buyurtma (`orders.user_id`) qilishi mumkin.
  • ON DELETE CASCADE: Mijoz hisobi o'chirilganda, unga tegishli barcha buyurtmalar ham avtomatik tozalanadi.
Sxema yaratish

Jadvallar Tuzish: Cheklovlar va Turlar

-- 1. Foydalanuvchilar jadvali
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    email VARCHAR(255) NOT NULL UNIQUE,
    full_name VARCHAR(100) NOT NULL,
    balance NUMERIC(10, 2) DEFAULT 0.00 CHECK (balance >= 0),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 2. Buyurtmalar jadvali (FK bilan)
CREATE TABLE orders (
    id SERIAL PRIMARY KEY,
    user_id INT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
    total_price NUMERIC(10, 2) NOT NULL CHECK (total_price > 0),
    status VARCHAR(20) DEFAULT 'pending',
    ordered_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Sxema cheklovlarining vazifasi

  • NOT NULL: Qiymatsiz (bo'sh) ustunlar kiritilishini qat'iy taqiqlaydi.
  • UNIQUE: Tizimda bitta email bilan 2 marta ro'yxatdan o'tishning oldini oladi.
  • CHECK: Mantiqiy cheklov — balans yoki narx manfiy bo'lishiga aslo yo'l qo'ymaydi.
Ma'lumotlar bilan ishlash

CRUD Operatsiyalari va Tranzaksiyalar

-- C (Create): Ma'lumot kiritish
INSERT INTO users (email, full_name, balance)
VALUES ('jasur@target.uz', 'Jasur Aliyev', 500000.00);

-- R (Read): Tanlash va saralash
SELECT id, full_name, balance FROM users
WHERE balance > 100000
ORDER BY balance DESC LIMIT 10;

-- U (Update) & D (Delete)
UPDATE users SET balance = balance - 50000 WHERE id = 1;
DELETE FROM orders WHERE status = 'cancelled';

Xavfsiz Tranzaksiya (BEGIN / COMMIT)

  • Bank o'tkazmasi muammosi: 1-odamdan pul yechilib, 2-odamga yetmasdan server o'chsa nima bo'ladi?
  • BEGIN TRANSACTION: Tranzaksiya ochiladi, barcha oraliq hisob-kitoblar xavfsiz tamponda bajariladi.
  • COMMIT: Hammasi muvaffaqiyatli o'tsagina diskka muhrlanadi. Xato bo'lsa: ROLLBACK barchasini orqaga qaytaradi.
Jadvallarni birlashtirish

INNER JOIN va LEFT JOIN Farqi

-- INNER JOIN: Faqat buyurtmasi bor foydalanuvchilar

SELECT users.full_name, orders.id AS order_id, orders.total_price

FROM users

INNER JOIN orders ON users.id = orders.user_id;


-- LEFT JOIN: Barcha foydalanuvchilar (hatto buyurtmasi yo'qlar ham)

SELECT users.full_name, COUNT(orders.id) AS total_orders

FROM users

LEFT JOIN orders ON users.id = orders.user_id

GROUP BY users.id, users.full_name;

Qaysi birini qachon ishlatamiz?

  • INNER JOIN: Faqat har ikki jadvalda ham mos keluvchi satrlar bo'lsa qaytaradi. Buyurtmasiz foydalanuvchilar chiqmaydi.
  • LEFT JOIN: Chap jadvaldagi barcha yozuvlarni oladi. Buyurtma bo'lmasa `NULL` qiymat qo'yadi. Foydalanuvchilar statistikasi uchun ideal.
Unumdorlik muhandisligi · Qidiruv rejasi

B-Tree Indekslar: 800ms dan 1ms gacha

Sequential Scan (Indekssiz — O(N))

  • To'liq ko'rib chiqish: Agar email ustunida indeks bo'lmasa, baza 1 000 000 satrni diskdan birma-bir o'qiydi.
  • CPU va Disk qizishi: Har bir so'rov 800–1200ms vaqt sarflaydi va diskni haddan ortiq yuklaydi.
  • Dvigatel rejasi: EXPLAIN QUERY PLAN buyrug'i sekin SCAN TABLE users deb ko'rsatadi.

B-Tree Index Scan (Indeksli — O(log N))

  • B-Tree daraxti: CREATE INDEX idx_users_email ON users(email); buyrug'i saralangan ko'rsatkich daraxti quradi.
  • Millisekundlik javob: 1 million yozuv orasidan qidirish bor-yo'g'i ~20 ta taqqoslash bilan 1ms da bajariladi.
  • Dvigatel rejasi: Baza darhol tezkor SEARCH TABLE users USING INDEX rejimiga o'tadi.
Zararli so'rovlar

SQL Injection: Buzg'unchilik va 100% Himoya

// ❌ XAVFLI: String konkatenatsiyasi (SQL Injection)

const userEmail = req.body.email; // Kiritildi: ' OR '1'='1

const query = `SELECT * FROM users WHERE email = '${userEmail}'`;

// Baza bajaradi: SELECT * FROM users WHERE email = '' OR '1'='1'

// NATIJA: Barcha foydalanuvchilar parollari o'g'irlanadi!


// ✅ 100% XAVFSIZ: Parameterized Query (Prepared Statement)

const safeQuery = 'SELECT * FROM users WHERE email = $1';

const result = await db.query(safeQuery, [userEmail]);

// Baza foydalanuvchi kiritgan matnni HECH QACHON kod deb o'ylamaydi!

Nega Prepared Statement yengilmas?

  • Kod va Ma'lumot ajratiladi: SQL mantiq serverda oldindan kompilyatsiya qilinadi.
  • Belgilar zararsizlantiriladi: Kiritilgan tirnoqlar (`'`), nuqta-vergul (`;`) faqat oddiy matn sifatida qabul qilinadi.
  • Sanoat standarti: Hech bir professional dasturchi SQL so'rovini qo'lda matn qo'shib yozmaydi.
Laboratoriyaga tayyorgarlik

Amaliy Missiya: Relyatsion Baza Loyihalash va Xavfsiz Qidiruv

Missiya topshiriqlari

  • 1. DDL Sxema: `users` va `orders` jadvallarini PK, FK va CHECK cheklovlari bilan yarating.
  • 2. ACID Tranzaksiya: `BEGIN ... COMMIT` bilan yangi buyurtma va balans yechish amalini yozing.
  • 3. JOIN Tahlili: Barcha foydalanuvchilar va ularning jami xarajatlarini hisoblovchi LEFT JOIN so'rovini quring.
  • 4. Kiber-Himoya: Berilgan zaif so'rovni Prepared Statement holatiga o'tkazing.

Laboratoriya Maydoni va Buyruqlar

  • 1. Ishga tushirish: Terminalda `sqlite3 shop.db` buyrug'ini bering.
  • 2. Toza format: `.headers on` va `.mode table` buyruqlarini yozing.
  • 3. FK yoqish: `PRAGMA foreign_keys = ON;` buyrug'ini kiriting.
  • 4. Qayd etish: Chiqqan natijalarni ish varaqasidagi jadvalga qayd eting.
Mustaqil amaliy ish

Laboratoriya Ishi: 15 Daqiqa

15:00

Terminalda jadvallarni yarating, JOIN so'rovlarini tekshiring va varaqani to'ldiring.

Zamonaviy backend vositalari

Raw SQL vs ORM (Prisma / Drizzle / TypeORM)

// Prisma ORM orqali turga mos (Type-safe) so'rov

const userWithOrders = await prisma.user.findUnique({

  where: { email: 'jasur@target.uz' },

  include: {

    orders: {

      where: { status: 'completed' },

      orderBy: { total_price: 'desc' }

    }

  }

});

// TypeScript xatolarni kod yozish jarayonidayoq ushlaydi!

Taqqoslash va Tavsiyalar

  • Raw SQL (Sof SQL): Eng yuqori tezlik va 100% nazorat. Murakkab hisobotlar va tahliliy so'rovlar uchun tengsiz.
  • Zamonaviy ORM: Ishlab chiqish tezligi 3 barobar oshadi, avtomatik migratsiyalar va TypeScript tiplashtirish kafolati.
  • Qoida: Oddiy CRUD uchun ORM, yuqori yuklamali va murakkab hisob-kitoblar uchun sof SQL.
Dars yakuni va baholash

Xulosa va Baholash Mezoni (10 Ball)

Bugungi asosiy xulosalar

  • RDBMS o'rnini hech narsa bosa olmaydi: ACID kafolatlari ma'lumotlar yo'qolishiga yo'l qo'ymaydi.
  • Relyatsion aloqalar: PK va FK jadvallar o'rtasida toza va yaxlit bog'lanish yaratadi.
  • Indekslar — tezlik garovi: B-Tree indekslar qidiruvni O(N) dan O(log N) ga tushiradi.
  • Prepared Statements majburiy: Foydalanuvchi ma'lumotini SQL so'roviga string qilib ulamang.

10 Ballik Baholash Mezoni

  • 2 ball: ACID tamoyillari va relyatsion model tushunchasi.
  • 3 ball: To'g'ri cheklovlar bilan DDL sxema yozish (PK, FK, CHECK).
  • 3 ball: JOIN so'rovlari va agregatsiya (COUNT/SUM).
  • 2 ball: SQL Injection tahlili va Prepared Statement himoyasi.
Target International SchoolTarget International School Введение 1 / 1 0–3