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:
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) jadvalN:M misol (oraliq jadval):
students(id, name)
courses(id, title)
enrollments(student_id, course_id, enrolled_at) -- junction2. 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.
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:
posts(id, ..., comment_count) har izoh sanashni JOIN qilmaslik uchun saqlanadiQachon: 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)
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 BYishlatiladigan ustun. - Kompozit indeks tartibi: eng tanlovchi (selective) ustun oldinda; chap prefiks qoidasi.
EXPLAIN ANALYZEbilan 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):
-- o'chirish o'rniga belgilash (tiklash mumkin, audit)
ALTER TABLE users ADD deleted_at TIMESTAMP;
-- so'rovlar: WHERE deleted_at IS NULLAudit 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)
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 level —
READ COMMITTED(default)SERIALIZABLE(qattiq, sekin). Race condition'ga qarshiSELECT ... FOR UPDATE(lock).
8. Miqyoslash (scaling)
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
- E-commerce uchun to'liq sxema loyihala (user, product, order, cart, review) — bog'lanishlar bilan.
- Sekin so'rovni
EXPLAIN ANALYZEbilan tahlil qilib, indeks bilan tezlashtir. - N:M bog'lanishni oraliq jadval bilan modellashtir.
- 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!