WisarWisar
Hamroh materiallar/Chuqur bilim4 daqiqa

Database dizayn pattern

Ma'lumotlar bazasi — ilovaning poydevori. Yomon sxema — keyinchalik azob (sekin so'rov, takror ma'lumot, bug). Bu 6-QISMning amaliy, dizaynga yo'naltirilgan davomi.


1. Ma'lumot modellashtirish (data modeling)

Qadamlar: 1) entitilarni top (User, Order, Product) 2) atributlar (maydon) 3) bog'lanishlar (relationship) 4) jadvalga aylantir.

Bog'lanish turlari:

text
1:1   (bir-bir)    — User  Profile         foreign key bir tomonda
1:N   (bir-ko'p)   — User  Orders          FK "ko'p" tomonda (order.user_id)
N:M   (ko'p-ko'p)  — Student  Course       oraliq (junction) jadval

N:M misol (oraliq jadval):

sql
students(id, name)
courses(id, title)
enrollments(student_id, course_id, enrolled_at)  -- junction

2. Normalizatsiya

Takror ma'lumotni kamaytirib, jadvallarga bo'lish:

  • 1NF: har katak — bitta qiymat (massiv yo'q).
  • 2NF: har maydon to'liq kalitga bog'liq.
  • 3NF: maydonlar bir-biriga emas, faqat kalitga bog'liq.
text
 Normallashmagan (takror):
  orders(id, user_name, user_email, product_name, product_price)

 Normallashgan:
  users(id, name, email)
  products(id, name, price)
  orders(id, user_id  users, product_id  products, quantity)

Foyda: takror yo'q, yaxlitlik (bir joyda yangilash). Narx: ko'proq JOIN.


3. Denormalizatsiya (ataylab takror)

O'qish-og'ir holatda tezlik uchun ataylab takrorlash:

text
posts(id, ..., comment_count)    har izoh sanashni JOIN qilmaslik uchun saqlanadi

Qachon: o'qish yozishdan ancha ko'p, JOIN sekin. Narx: yangilashda izchillikni saqlash kerak (trigger yoki app mantiq). Qoida: avval normallashtir, kerak bo'lsa (o'lchab) denormalizatsiya qil.


4. Indeks strategiyasi (6.9)

sql
CREATE INDEX idx_users_email ON users(email);           -- bitta ustun
CREATE INDEX idx_orders_user_date ON orders(user_id, created_at);  -- kompozit
CREATE UNIQUE INDEX idx_email_unique ON users(email);   -- noyob
  • Qayerga: tez-tez WHERE, JOIN, ORDER BY ishlatiladigan ustun.
  • Kompozit indeks tartibi: eng tanlovchi (selective) ustun oldinda; chap prefiks qoidasi.
  • EXPLAIN ANALYZE bilan tekshir — "Seq Scan" (yomon) yoki "Index Scan" (yaxshi)?
  • Ortiqcha indeks zararli — yozishni sekinlashtiradi, joy oladi.

5. Kalitlar (keys)

  • Primary key: har qatorni noyob aniqlaydi.
    • Auto-increment ID — oddiy, tartibli, lekin bashoratli (xavfsizlik).
    • UUID — taqsimlangan, bashoratsiz, lekin katta/tartibsiz (indeks samarasi past). UUID v7 — tartibli.
  • Foreign key: boshqa jadval kalitiga ishora; yaxlitlikni kafolatlaydi (ON DELETE CASCADE/RESTRICT).
  • Natural vs surrogate: email (natural) o'rniga id (surrogate) — yaxshiroq (o'zgarmas).

6. Keng tarqalgan pattern'lar

Soft delete (yumshoq o'chirish):

sql
-- o'chirish o'rniga belgilash (tiklash mumkin, audit)
ALTER TABLE users ADD deleted_at TIMESTAMP;
-- so'rovlar: WHERE deleted_at IS NULL

Audit ustunlar: created_at, updated_at, created_by — har jadvalga.

Holat mashinasi (state): status ustun (pending/active/done) + ruxsat etilgan o'tishlar.

Versiyalash: muhim yozuvlar tarixini alohida jadvalda saqlash.

Polimorfik bog'lanish: comments(commentable_type, commentable_id) — izoh ham post, ham rasmga (ehtiyotkorlik bilan).


7. Tranzaksiya va izchillik (6.10)

sql
BEGIN;
  UPDATE accounts SET balance = balance - 100 WHERE id = 1;
  UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;   -- ikkalasi ham, yoki hech biri (atomik)
  • ACID — moliya, zaxira kabi kritik joylarda.
  • Isolation levelREAD COMMITTED (default) SERIALIZABLE (qattiq, sekin). Race condition'ga qarshi SELECT ... FOR UPDATE (lock).

8. Miqyoslash (scaling)

text
1. INDEKS + so'rov optimizatsiya    (birinchi, eng arzon)
2. READ REPLICA — o'qishni nusxalarga taqsimlash
3. KESH (Redis) — tez-tez o'qiladigan ma'lumot
4. PARTITIONING — bitta jadvalni bo'laklarga (sana bo'yicha)
5. SHARDING — ma'lumotni serverlarga bo'lish (eng murakkab, oxirgi chora)

Sharding — murakkab (JOIN qiyin, taqsimlangan tranzaksiya). Avval indeks/replica/kesh; sharding faqat haqiqatan kerak bo'lganda.


9. SQL vs NoSQL tanlovi

SQL (PostgreSQL) NoSQL (MongoDB)
Sxema qat'iy, oldindan moslashuvchan
Bog'lanish kuchli (JOIN, FK) zaif (qo'lda)
Izchillik ACID eventual (ko'pincha)
Miqyos vertikal + replica gorizontal oson
Qachon bog'liq, izchil ma'lumot o'zgaruvchan, katta, hujjat

Ko'pincha: PostgreSQL default to'g'ri tanlov (hatto JSON ham qo'llab-quvvatlaydi).


10. Anti-patternlar

  • SELECT * (faqat kerakli ustun).
  • Indekssiz katta jadval qidiruvi.
  • N+1 so'rov (tsiklda).
  • Ma'lumotni kodda JOIN qilish (DB qila oladi).
  • Hamma narsani bitta jadvalga (god table).
  • Foreign key'siz bog'lanish (yaxlitlik buziladi).
  • EAV (entity-attribute-value) — ko'pincha noto'g'ri tanlov.
  • Migratsiyasiz sxema o'zgartirish (qo'lda).

Mashq

  1. E-commerce uchun to'liq sxema loyihala (user, product, order, cart, review) — bog'lanishlar bilan.
  2. Sekin so'rovni EXPLAIN ANALYZE bilan tahlil qilib, indeks bilan tezlashtir.
  3. N:M bog'lanishni oraliq jadval bilan modellashtir.
  4. Soft delete + audit ustunlarni qo'sh.

Bog'liq: 6-QISM, Mashqlar M6 · Bosh sahifa: README.

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
Database dizayn pattern — Wisar