4-bosqich

Database

Ma'lumotlarni saqlash va boshqarish - ilovaning xotirasi va yuragini tushunish.

22 daqiqa o'qish O'rta daraja

Database nima?

Database (ma'lumotlar bazasi) - bu ma'lumotlarni tartibli ravishda saqlash, boshqarish va olish uchun mo'ljallangan tizim. Ilovaning "xotirasi" deb tushunish mumkin.

Har qanday ilova ma'lumotlar bilan ishlaydi:

  • Foydalanuvchi ma'lumotlari - ism, email, parol
  • Kontent - postlar, mahsulotlar, sharhlar
  • Tranzaksiyalar - buyurtmalar, to'lovlar
  • Loglar - harakatlar tarixi, analytics

Database Management System (DBMS) - bu databaseni boshqaruvchi dastur. MySQL, PostgreSQL, MongoDB - bular DBMS misolari.

Oddiy tushuntirish

Database - bu tartibli shkaf. Har bir javon (table) ma'lum turdagi narsalarni saqlaydi. Har bir narsa (row) o'z joyida, yorliq (column) bilan belgilangan. DBMS esa bu shkafni boshqaruvchi xodim.

Nega kerak?

Ma'lumotlarni oddiy fayllarda saqlash mumkin emas mi? Kichik loyihalarda ha, lekin real ilovalar uchun database zarur:

Tez qidiruv

1 million recorddan kerakli ma'lumotni millisekundlarda topish. Indekslar bunga yordam beradi.

Concurrent access

Minglab foydalanuvchilar bir vaqtda ma'lumotlarni o'qish/yozish. Lock va transaction boshqaruvi.

Ma'lumot yaxlitligi

ACID xususiyatlari - ma'lumotlar hech qachon buzilmaydi, yarim holatda qolmaydi.

Backup va Recovery

Server ishdan chiqsa ham ma'lumotlar saqlanadi. Point-in-time recovery imkoniyati.

Real misol

2017-yilda GitLab database'dan 300GB ma'lumot yo'qotdi - backup ishlamagan edi. 6 soat downtime va katta moliyaviy yo'qotish. Database backup - majburiy!

Asosiy tushunchalar

SQL vs NoSQL

SQL (Relational)

  • Strukturalangan, jadval (table) asosida
  • Schema belgilangan (qat'iy struktura)
  • ACID compliant (transactions)
  • JOIN orqali bog'langan ma'lumotlar
  • PostgreSQL, MySQL, Oracle

NoSQL (Non-relational)

  • Flexible, document/key-value asosida
  • Schema-less (erkin struktura)
  • Horizontal scaling oson
  • Denormalization, embedded docs
  • MongoDB, Redis, Cassandra

Schema Design

Schema - bu database strukturasi. Yaxshi schema dizayni:

  • Normalization - takrorlanishni kamaytirish (1NF, 2NF, 3NF)
  • Primary Key - har bir row uchun unique identifikator
  • Foreign Key - tablelar orasidagi bog'lanish
  • Indexes - tez qidiruv uchun strukturalar
  • Constraints - NOT NULL, UNIQUE, CHECK

Indexing

Index - bu kitob oxiridagi "index" kabi. Butun kitobni o'qimasdan, kerakli sahifani tez topish:

  • B-Tree index - eng keng tarqalgan, range query uchun
  • Hash index - exact match uchun, juda tez
  • Composite index - bir nechta column'ga index
  • Full-text index - matn qidiruvi uchun

Transactions va ACID

Transaction - bu bir nechta operatsiyani bitta "atomik" birlik sifatida bajarish:

  • Atomicity - hammasi bajariladi yoki hech narsa
  • Consistency - database har doim valid holatda
  • Isolation - transactionlar bir-biriga ta'sir qilmaydi
  • Durability - commit bo'lgandan keyin ma'lumot saqlanadi

Migrations

Migration - bu schema o'zgarishlarini versiyalash va boshqarish:

  • Yangi table, column qo'shish
  • Ma'lumotlarni o'zgartirish
  • Rollback imkoniyati
  • Jamoa bo'ylab sync

Amaliy jarayon (step-by-step)

1

Requirements tahlili

Qanday ma'lumotlar saqlanadi? Qanday so'rovlar bo'ladi? Read vs Write nisbati qanday?

2

Database tanlash

SQL (PostgreSQL) yoki NoSQL (MongoDB)? Workload, scaling, jamoa tajribasi asosida qaror qiling.

3

Schema dizayni

ERD (Entity Relationship Diagram) chizing. Tablelar, relationshiplar, constraintlarni aniqlang.

4

Migration yaratish

Prisma, Flyway, Alembic bilan migration fayllarini yozing. Version control'da saqlang.

5

Index strategiyasi

Ko'p ishlatiladigan query'larni tahlil qiling. Kerakli indekslarni qo'shing, lekin ortiqcha indeks qo'ymang.

6

ORM yoki Query Builder

Prisma, TypeORM, SQLAlchemy bilan type-safe database operatsiyalarini yozing.

7

Backup sozlash

Automated daily backup, point-in-time recovery, backup testing - muntazam tekshirish.

8

Monitoring

Slow query log, connection pool, disk usage, replication lag - barcha metrikalarni kuzating.

Eng ko'p uchraydigan xatolar

1. Index yo'qligi

WHERE clause'da ishlatiladigan column'larga index qo'ymaslik - full table scan va sekin query'lar. EXPLAIN ANALYZE bilan tekshiring.

2. N+1 Query muammosi

Loop ichida query bajarish o'rniga, eager loading (JOIN) ishlatish kerak. 100 ta alohida query o'rniga 1 ta JOIN.

3. Backup test qilmaslik

Backup bor, lekin hech qachon restore test qilinmagan. Haqiqiy muammo bo'lganda ishlamay qoladi.

4. Production'da schema o'zgartirish

Migrationlarsiz to'g'ridan-to'g'ri ALTER TABLE ishlatish - xavfli va kuzatib bo'lmaydi.

Yechim

Database monitoring tool o'rnating (pgHero, MongoDB Compass). Slow query'larni avtomatik aniqlang. Backup'ni har oyda test qiling.

Best practices

  • Har bir table'da surrogate primary key (id) ishlating - UUID yoki auto-increment
  • created_at va updated_at column'larini qo'shing - debugging uchun zarur
  • Foreign key constraintlarini e'tiborsiz qoldirmang - data integrity
  • Connection pooling ishlating - har so'rovda yangi connection ochish xato
  • Soft delete (is_deleted flag) o'rniga hard delete - audit uchun
  • Sensitive ma'lumotlarni encrypt qiling - PII, financial data
  • Read replica'lar bilan read traffic'ni taqsimlang
  • Database-specific features o'rganing - PostgreSQL JSONB, MySQL full-text
  • Query'larni parametrize qiling - SQL injection'dan himoya
  • Index faqat kerakli joyga - ortiqcha index write'ni sekinlashtiradi

Asboblar va texnologiyalar

PostgreSQL MySQL MongoDB Redis SQLite Prisma TypeORM SQLAlchemy Flyway pgAdmin MongoDB Compass DBeaver

PostgreSQL

Eng kuchli open-source SQL database. JSONB, full-text search, extensions.

Prisma

Next-gen ORM. Type-safe queries, auto-migration, Prisma Studio GUI.

Redis

In-memory key-value store. Cache, session, pub/sub, rate limiting uchun ideal.

Mini misol

PostgreSQL schema va Prisma ORM misoli:

prisma - schema.prisma
// Prisma schema - database modellarini aniqlash

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

model User {
  id        String   @id @default(uuid())
  email     String   @unique
  name      String?
  password  String
  role      Role     @default(USER)
  posts     Post[]
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt

  @@index([email])
}

model Post {
  id        String   @id @default(uuid())
  title     String
  content   String?
  published Boolean  @default(false)
  author    User     @relation(fields: [authorId], references: [id])
  authorId  String
  tags      Tag[]
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt

  @@index([authorId])
  @@index([published])
}

model Tag {
  id    String @id @default(uuid())
  name  String @unique
  posts Post[]
}

enum Role {
  USER
  ADMIN
}

Prisma Client bilan CRUD operatsiyalari:

typescript - userService.ts
import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();

// Yangi user yaratish
async function createUser(email: string, name: string, password: string) {
  return prisma.user.create({
    data: {
      email,
      name,
      password: await hashPassword(password),
    },
  });
}

// User va uning postlarini olish (eager loading)
async function getUserWithPosts(userId: string) {
  return prisma.user.findUnique({
    where: { id: userId },
    include: {
      posts: {
        where: { published: true },
        orderBy: { createdAt: 'desc' },
        take: 10,
      },
    },
  });
}

// Transaction bilan pul o'tkazish
async function transferCredits(fromId: string, toId: string, amount: number) {
  return prisma.$transaction(async (tx) => {
    // Yuboruvchidan ayirish
    const sender = await tx.user.update({
      where: { id: fromId },
      data: { credits: { decrement: amount } },
    });
    
    if (sender.credits < 0) {
      throw new Error('Insufficient credits');
    }
    
    // Qabul qiluvchiga qo'shish
    await tx.user.update({
      where: { id: toId },
      data: { credits: { increment: amount } },
    });
    
    return sender;
  });
}

Raw SQL query (murakkab holatlar uchun):

sql
-- Index yaratish
CREATE INDEX idx_posts_author_published 
ON posts (author_id, published) 
WHERE published = true;

-- Aggregation query
SELECT 
  u.id,
  u.name,
  COUNT(p.id) AS post_count,
  MAX(p.created_at) AS last_post_date
FROM users u
LEFT JOIN posts p ON u.id = p.author_id
WHERE u.role = 'ADMIN'
GROUP BY u.id, u.name
HAVING COUNT(p.id) > 5
ORDER BY post_count DESC
LIMIT 10;

Xavfsizlik va ishonchlilik

  • SQL Injection'dan himoya: HECH QACHON string concatenation ishlatmang. Prepared statements yoki ORM.
  • Database credentials'ni .env faylda saqlang, kodda emas. Secrets manager ishlating.
  • Principle of Least Privilege: app uchun alohida DB user, faqat kerakli permissionlar.
  • Sensitive data encryption: parollar (bcrypt), PII (application-level encryption).
  • Network security: VPC ichida, public access yo'q, SSL/TLS connections.
  • Audit logging: kim, qachon, nima o'zgartirdi - barcha critical operatsiyalarni log qiling.

Ko'p so'raladigan savollar (FAQ)

Ko'p holatlarda SQL (PostgreSQL) bilan boshlang - u ko'proq use case'larni qamrab oladi. NoSQL faqat: juda yuqori write throughput, schema-less data, horizontal scaling zarur bo'lganda. Netflix, Uber kabi gigantlar ham SQL va NoSQL ni birga ishlatadi.

PostgreSQL: ko'proq features (JSONB, full-text, extensions), strict SQL compliance, murakkab query'lar uchun yaxshi. MySQL: oddiyroq, tezroq read'lar, keng qo'llab-quvvatlash. Agar tanlash imkoni bo'lsa - PostgreSQL tavsiya etiladi.

WHERE, JOIN, ORDER BY da tez-tez ishlatiladigan column'larga. Lekin: har bir index write operatsiyalarini sekinlashtiradi va disk ishlatadi. EXPLAIN ANALYZE bilan query'ni tahlil qiling, keyin qaror qiling. Optimizatsiya - premature optimization emas, o'lchab qiling.

ORM (Prisma, TypeORM): type-safety, productivity, oddiy CRUD uchun. Raw SQL: murakkab query'lar, performance-critical joylar, database-specific features. Amalda ikkalasi ham kerak - ORM asosiy, raw SQL qiyin holatlar uchun.

Schema o'zgarishlarini version control qilish. Jamoadagi barcha developerlar bir xil database strukturasida ishlaydi. Production'ga deploy qilish automated va xavfsiz. Rollback imkoniyati - xato bo'lsa orqaga qaytish.

Database connection ochish "qimmat" operatsiya (50-100ms). Connection pool oldindan ochilgan connectionlarni saqlaydi va qayta ishlatadi. Node.js uchun PgBouncer, yoki ORM'ning built-in pooler'i. Pool size = CPU cores * 2-4.

Primary database'dan replica(lar)ga ma'lumotlarni nusxalash. Read traffic'ni replica'larga yo'naltirish (read scaling). High availability - primary ishdan chiqsa, replica primary bo'ladi. Geo-distribution - foydalanuvchilarga yaqinroq read.

Ma'lumotlar bitta serverga sig'masa yoki write throughput yetmasa. Sharding murakkab - horizontal partitioning, routing, distributed transactions. Ko'p hollarda vertical scaling (kuchliroq server) yetarli. Sharding - oxirgi chora.

Glossary (Atamalar lug'ati)

DBMS Database Management System - ma'lumotlar bazasini boshqaruvchi dastur (PostgreSQL, MySQL).
Schema Database strukturasi - tablelar, columnlar, relationshiplar, constraintlar.
Primary Key Har bir row'ni unique identifikatsiya qiluvchi column (yoki columnlar).
Foreign Key Boshqa table'ning primary key'iga reference - relationshiplar uchun.
Index Query'larni tezlashtiruvchi struktura - B-tree, Hash, va boshqalar.
Transaction Bir nechta operatsiyani atomik birlik sifatida bajarish - hammasi yoki hech narsa.
ACID Atomicity, Consistency, Isolation, Durability - transaction xususiyatlari.
Normalization Ma'lumotlar takrorlanishini kamaytirish uchun schema dizayn texnikasi.
JOIN Bir nechta tabledan ma'lumotlarni birlashtirish - INNER, LEFT, RIGHT, FULL.
ORM Object-Relational Mapping - kod objektlarini database row'lariga mapping.
Migration Schema o'zgarishlarini versiyalash va deploy qilish mexanizmi.
Replica Primary database'ning nusxasi - read scaling va high availability uchun.