6.15-bob: Connection pooling va ER modeling (DB dizayni)
6-QISM — Ma'lumotlar bazasi (Database) · 15-mavzu (yakuniy)
1. Kirish va motivatsiya
6-QISMning yakuniy bobiga keldik. Butun qism davomida DB asoslari 6.1-bob, MongoDB (6.2-6.3), SQL (6.4-6.10), ORM'lar (6.11-6.14) — hammasini o'rgandik. Bu bob ikki muhim, yakunlovchi mavzuni birlashtiradi: connection pooling (DB ulanishlarini samarali boshqarish — chuqur) va ER modeling (Entity-Relationship — DB'ni boshidan to'g'ri loyihalash). Birinchisi — production tezligi va barqarorligi; ikkinchisi — butun DB dizaynining poydevori (6-QISMni umumlashtiradi: dizayndan optimizatsiyagacha).
Connection pooling ni 6.5/6.6 da ishlatdik (ORM'lar ham ichida qo'llaydi). Lekin u chuqurroq tushunishga arziydi: DB ulanishi — qimmat resurs (har ulanish CPU/RAM oladi); ko'p foydalanuvchili ilovada ulanishlarni to'g'ri boshqarmasa — DB ulanishlardan tugaydi (production'da eng ko'p uchraydigan falokat). Pool — ulanishlarni qayta ishlatadi; lekin uning hajmini to'g'ri sozlash, va ulkan masshtabda PgBouncer kabi tashqi pooler — alohida bilim.
ER modeling — DB'ni kod yozishdan oldin to'g'ri loyihalash. Ko'p loyiha shoshib, o'ylamasdan jadval yaratadi keyinroq muammo (noto'g'ri bog'lanish, takror — qayta yozish qimmat). ER (Entity-Relationship) diagrammasi — biznes talablarini entity (mavjudot), atribut, bog'lanish (cardinality)ga aylantirib, vizual loyihalash. Bu — normalizatsiya 6.9-bob, relations 6.1-bob — hammasining amaliy birlashmasi. Yaxshi DB dizayni — yaxshi ilovaning yarmidan ko'pi.
O'xshatish 1 (pool): DB ulanishi — restoran stoli. Har mijozga (so'rov) alohida yangi stol yasash (har so'rovda ulanish) — bemaqsad. Pool — tayyor stollar to'plami: mijoz keladi, bo'sh stolga o'tiradi, ketganda stol bo'shaydi (qayta ishlatiladi). Stollar soni (pool hajmi) cheklangan — juda kam (navbat), juda ko'p (joy/xizmat yetmaydi). To'g'ri son — kalit.
O'xshatish 2 (ER modeling): ER diagramma — uy qurishdan oldingi arxitektura chizmasi. Chizmasiz g'isht terish (o'ylamasdan jadval) — devor qiyshiq, xona noto'g'ri (qayta buzish). Chizma (ER) — xonalar (entity), eshik-derazalar (atribut), xonalar orasidagi yo'laklar (bog'lanish) — oldindan rejalashtirilgan. Keyin qurish (kod) — aniq, xatosiz.
Nega muhim?
- Production barqarorligi — pool noto'g'ri "too many connections" (DB qulaydi).
- Tezlik — pool ulanishni qayta ishlatadi (har so'rovda ulanmaslik).
- DB dizayni poydevori — ER modeling to'g'ri loyihalash (qayta yozishni oldini oladi).
- 6-QISM yakuni — dizayndan (ER) optimizatsiyagacha (pool) — hammasi birga.
2. Nazariya — chuqur tushuntirish
2.1. DB ulanishi — qimmat resurs
Har DB ulanishi (connection) — qimmat (mojoauth):
Bir ulanish:
- DB serverda jarayon/thread (PostgreSQL — har ulanish alohida jarayon!)
- CPU + RAM (har ulanish ~5-10MB)
- Ulanish o'rnatish vaqti (TCP, autentifikatsiya — millisekund)
DB'da MAX ulanish chegarasi bor (PostgreSQL default ~100)
Chegaradan oshsa: "too many connections" (yangi so'rov rad — falokat)Asosiy muammo: DB ulanishlari cheklangan (max_connections). Har so'rovda yangi ulanish — (1) sekin (o'rnatish vaqti), (2) tez tugaydi (chegara). Ko'p foydalanuvchili ilovada bu — production falokat (DB qulaydi).
2.2. Connection pool — yechim (chuqur)
Connection pool — oldindan ochilgan ulanishlar to'plami, qayta ishlatiladigan (6.5: 2.5):
Pool (masalan 10 ulanish):
┌──────────────────────────────┐
│ [bo'sh] [band] [bo'sh] ... │ 10 ta tayyor ulanish
└──────────────────────────────┘
So'rov keladi bo'sh ulanishni OLADI ishlatadi QAYTARADI (bo'shaydi)
Bo'sh yo'q bo'lsa kutadi (navbat) yoki xato (sozlamaga qarab)
1000 so'rov, lekin faqat 10 ulanish (qayta ishlatish — 2.1 muammosini hal)Pool mohiyati: ulanishni o'rnatib qo'yadi (bir marta), qayta ishlatadi (har so'rovda emas). Ulanish soni cheklangan (pool hajmi), lekin so'rovlar ko'p — ulanishlar navbatda almashinadi. Bu — tezlik + barqarorlik (DB chegarasidan oshmaydi).
2.3. Pool hajmini sozlash (eng muhim qaror)
Pool hajmi (pool size) — juda muhim parametr (mojoauth/pgbouncer):
Juda KICHIK pool:
so'rovlar bo'sh ulanish kutadi (sekin, navbat uzun)
Juda KATTA pool:
DB ko'p ulanish bilan band (CPU/RAM isrof, kontekst almashinuvi sekin)
DB max_connections'dan oshishi mumkin (xato)
Optimal formula (pgbouncer):
pool_size ≈ (cpu_cores * 2) + disk_count
masalan 4 yadro: ~8-10 (boshlang'ich)"Ko'proq pool = tezroq" — NOTO'G'RI: ko'p ulanish DB'ni sekinlashtiradi (CPU kontekst almashinuvi). Optimal — kichik, samarali pool (
cpu*2atrofida). OLTP ilova uchun 10-30 (manba). O'lchab sozlash (monitoring — 2.10).
2.4. Pool sozlamalari (parametrlar)
max (connectionLimit) — maksimal ulanish (pool hajmi — 2.3)
min — minimal (doim ochiq — tez javob)
idleTimeout — bo'sh ulanishni yopish vaqti
acquireTimeout — bo'sh ulanish kutish vaqti (oshsa — xato)
connectionTimeout — ulanish o'rnatish vaqti// pg 6.6-bob yoki ORM pool sozlamasi
const pool = new Pool({
max: 10, // max ulanish (2.3)
min: 2, // min (doim tayyor)
idleTimeoutMillis: 30000, // 30s bo'sh yop
connectionTimeoutMillis: 5000, // 5s ulanmasa xato
});2.5. Ko'p instansiya muammosi (masshtab)
Bir nechta ilova instansiyasi (server — 10.2) bo'lsa, pool muammosi:
Muammo:
3 ilova instansiyasi × har biri 10 pool = 30 ulanish
10 instansiya × 10 = 100 ulanish DB max'ga yetadi!
Ko'p instansiyada har biri o'z pool'iga ega (jami ko'payadi)
DB max_connections'dan oshishi mumkinKo'p server (horizontal scale — 9, 10) — har biri pool ochadi jami ulanish ko'payadi. DB chegarasi bir xil (max_connections). Yechim: pool hajmini hisoblash (instansiya × pool ≤ max), yoki tashqi pooler (PgBouncer — 2.6).
2.6. PgBouncer (tashqi connection pooler)
PgBouncer — PostgreSQL uchun tashqi, markaziy connection pooler (pgbouncer.org):
Ilova pool'lari (har biri kichik)
┌─────────────┐
│ PgBouncer │ markaziy pooler (minglab client kam DB ulanish)
└─────────────┘
(kam ulanish)
┌─────────────┐
│ PostgreSQL │ (max_connections — himoyalangan)
└─────────────┘
5000 client PgBouncer 25 DB ulanish (oneuptime)PgBouncer (oneuptime): ilova bilan DB orasida turuvchi pooler. Minglab client ulanishini kam DB ulanishiga "siqadi" (multiplexing). Ulkan masshtab (10K+ ulanish) uchun zarur. Pool rejimlari: session/transaction/statement. Cloud (Neon, Supabase) ko'pincha pooler beradi.
Serverless — ilova pool ishlamaydi: serverless funksiya (Lambda, Vercel — 10.2) har chaqiruvda qisqa umr ko'radi va bir-biriga bog'lanmagan. Har funksiya nusxasi o'z pool'ini ochsa — minglab funksiya bir vaqtda ishga tushganda DB darhol ulanishlardan tugaydi 2.1-bob. Yechim — tashqi pooler (PgBouncer/Neon/Supabase pooler, transaction rejimida): funksiya poolerga ulanadi, poolerning o'zi DB ulanishlarini kam tutadi. Ya'ni serverless'da pool ilovada emas, tashqarida turadi.
2.7. Pool best practices (xulosa)
Pool hajmi: (cpu*2) atrofida (juda katta emas — 2.3)
Ulanishni QAYTAR (release — 6.5: 2.10); ORM avtomatik
Ko'p instansiya: jami ulanish ≤ DB max 2.5-bob
Ulkan masshtab: PgBouncer 2.6-bob
Monitoring: waiting clients, ulanish foydalanishi 2.10-bob
Pool xatolarini boshqar (timeout, error event)2.8. ER modeling nima (DB dizayni)
ER (Entity-Relationship) modeling — DB'ni vizual, mantiqiy loyihalash (lucidchart):
ER modeling uch element:
ENTITY (mavjudot) — asosiy "narsa" (User, Product, Order) jadval
ATTRIBUTE (atribut) — entity xususiyati (ism, narx) ustun
RELATIONSHIP (bog'lanish) — entity'lar orasidagi aloqa FK
ER diagramma — bularni VIZUAL ko'rsatadi (kod yozishdan oldin)ER modeling — kod oldidan: biznes talablarini (so'z bilan) entity/atribut/bog'lanish (struktura)ga aylantirish. Bu — 6-QISMning hammasini (normalizatsiya 6.9, relations 6.1) amaliy birlashtiradi. Yaxshi ER — yaxshi DB.
2.9. Entity va atribut aniqlash
Biznes talabidan entity ajratish (otlar — nouns):
"Foydalanuvchilar mahsulot buyurtma qiladi"
Entity'lar: User, Product, Order (asosiy "narsalar")
Atributlar (har entity xususiyati):
User: id, ism, email, parol
Product: id, nom, narx, zaxira
Order: id, sana, holat, summa
Atribut turlari:
- Oddiy (ism), Kalit (PK — id), Hosilaviy (yosh — tug'ilgandan), Ko'p qiymatli (telefonlar — 6.9: 1NF)Entity'larni topish: biznes tavsifidagi otlar (foydalanuvchi, buyurtma, mahsulot) — odatda entity. Sifatlar/xususiyatlar — atribut. Fe'llar (buyurtma qiladi) — bog'lanish 2.10-bob. Bu — talablardan strukturaga o'tish.
2.10. Relationship va cardinality (bog'lanish turi)
Cardinality — bog'lanishdagi son (nechta-nechta — gleek):
One-to-One (1:1): bir entity — bir entity
User ─── Profile (har user bitta profil)
One-to-Many (1:N): bir entity — ko'p entity (ENG KENG TARQALGAN)
User ──< Order (bir user ko'p buyurtma; bir buyurtma bir user)
Many-to-Many (M:N): ko'p — ko'p
Product >──< Order (bir mahsulot ko'p buyurtmada; bir buyurtma ko'p mahsulot)
junction (oraliq) jadval kerak (OrderItems — 2.11) ER notatsiya (crow's foot):
──│ bitta (one)
──< ko'p (many)
──o ixtiyoriy (optional — 0 ham bo'lishi mumkin)Cardinality — eng muhim qaror (gleek): har bog'lanish nechta-nechta? 1:1 (kam), 1:N (eng ko'p — FK), M:N (junction jadval — 2.11). Noto'g'ri cardinality — noto'g'ri schema (qayta yozish). Optionality — majburiymi (har user buyurtma qilishi shartmi — yo'q, ixtiyoriy).
2.11. Many-to-Many — junction jadval
M:N bog'lanish to'g'ridan ifodalanmaydi — oraliq (junction) jadval kerak (miro):
Product M:N Order — to'g'ridan FK bilan bo'lmaydi
OrderItems (junction) jadval:
products: order_items: orders:
| id | nom | | order_id | product_id | | id | sana |
| 1 | Olma| | 10 | 1 | | 10 | ... |
| 10 | 2 | (buyurtma 10 da mahsulot 1 va 2)
M:N = ikkita 1:N (Product 1:N OrderItems N:1 Order)
junction'da qo'shimcha maydon ham (miqdor, narx — 6.3: snapshot)Junction jadval (miro): M:N — har doim oraliq jadval (ikki FK + qo'shimcha maydon). Masalan
OrderItems(order_id + product_id + miqdor + narx). Bu — relatsion DB'da M:N'ning yagona to'g'ri yo'li (6.9: normalizatsiya).
2.12. ER diagrammadan jadvalga (o'tish)
ER SQL jadval qoidalari:
Entity jadval
Atribut ustun
PK PRIMARY KEY 6.4-bob
1:1 FK (bir tomonda, unique)
1:N FK ("ko'p" tomonda — Order.user_id)
M:N junction jadval 2.11-bob
Hosilaviy saqlanmaydi (hisoblanadi) yoki denormalizatsiyaER jadval — mexanik o'tish (yuqoridagi qoidalar). ER to'g'ri bo'lsa — jadvallar to'g'ri. Bu — ER modeling'ning amaliy natijasi (chizmadan kodgacha — 1.8: Figma kabi, lekin DB uchun).
2.13. ER modeling jarayoni (qadamlar)
1. Talablarni yig'ish (biznes nima kerak)
2. Entity'larni aniqlash (otlar — 2.9)
3. Atributlarni aniqlash (har entity xususiyati)
4. Bog'lanishlarni aniqlash (cardinality — 2.10)
5. Normalizatsiya (1NF-3NF — 6.9)
6. ER diagramma chizish (vizual — dbdiagram.io, Lucidchart)
7. Jadvalga o'tkazish (SQL/ORM — 2.12)
8. Indeks/optimizatsiya rejasi (6.10)ER modeling — jarayon (bir martalik emas). Talab entity atribut bog'lanish normalizatsiya diagramma jadval. Vositalar: dbdiagram.io (kod bilan ER), Lucidchart, draw.io. Boshlanishida vaqt sarflash — keyin qayta yozishdan saqlaydi.
2.14. Yaxshi DB dizayni prinsiplari
Aniq, izchil nomlash (users, user_id — konvensiya — lucidchart)
Har jadval — bitta mavzu (entity — single responsibility)
To'g'ri PK (sun'iy id yoki tabiiy kalit)
Normalizatsiya (3NF — takror yo'q — 6.9); tanlab denormalizatsiya
To'g'ri cardinality (1:N, M:N — junction — 2.10)
FK + ON DELETE (yaxlitlik — 6.6: 2.7)
Indeks rejasi (tez-qidiriladigan — 6.10)
Kelajakni o'yla (o'sish, o'zgarish — migration — 6.14)2.15. Real misol — e-commerce ER (xulosa)
E-commerce ER (6-QISM birlashmasi):
User ──< Order ──< OrderItem >── Product
│ │ │
│ 1:N │ 1:N (junction M:N) │
│ │ │
└──< Address Category ──< Product (1:N)
(1:N)
- User 1:N Order (foydalanuvchi ko'p buyurtma)
- User 1:N Address (ko'p manzil)
- Order M:N Product (OrderItem junction — miqdor, narx)
- Category 1:N Product (kategoriya ko'p mahsulot)Bu — butun 6-QISM amalda: entity (User/Product/Order), bog'lanishlar (1:N, M:N), junction (OrderItem), normalizatsiya 6.9-bob, FK 6.6-bob, indeks 6.10-bob. Yaxshi ER — yaxshi ilova poydevori.
2.16. Best practices (14)
POOL:
Optimal hajm (cpu*2 — juda katta emas — 2.3)
Ulanishni qaytar (6.5: 2.10); ko'p instansiya hisobi 2.5-bob
Ulkan masshtab: PgBouncer 2.6-bob; monitoring 2.10-bob
ER MODELING:
Kod oldidan loyihalash (entity/atribut/cardinality — 2.8-2.10)
Normalizatsiya (3NF — 6.9); to'g'ri bog'lanish
Aniq nomlash; FK + yaxlitlik; indeks rejasi
Diagramma (dbdiagram.io); kelajakni o'yla (migration — 6.14)3. Tushunchalar — tez ma'lumotnoma
CONNECTION POOL 2.2-bob:
- Ulanishlarni qayta ishlatish; hajm: cpu*2 atrofida 2.3-bob
- max/min/idleTimeout 2.4-bob; ko'p instansiya hisobi 2.5-bob
- PgBouncer (tashqi pooler — ulkan masshtab — 2.6)
ER MODELING 2.8-bob:
- Entity (jadval) + Atribut (ustun) + Relationship (FK)
- Cardinality: 1:1, 1:N (FK), M:N (junction — 2.10, 2.11)
- ER jadval 2.12-bob; jarayon 2.13-bob; 3NF (6.9)4. Batafsil misollar
Misol 1 — Pool sozlash (optimal — 2.3, 2.4)
// PostgreSQL pool 6.6-bob — optimal sozlama
import pg from "pg";
const pool = new pg.Pool({
connectionString: process.env.DATABASE_URL,
max: 10, // (cpu*2) atrofida 2.3-bob — juda katta emas!
min: 2, // doim tayyor (tez javob)
idleTimeoutMillis: 30000, // 30s bo'sh yop (2.4)
connectionTimeoutMillis: 5000, // 5s ulanmasa xato
});
// Pool holatini kuzatish (monitoring — 2.16)
setInterval(() => {
console.log(`Pool: jami=${pool.totalCount} bo'sh=${pool.idleCount} kutayotgan=${pool.waitingCount}`);
}, 60000);
// waitingCount > 0 doimiy pool kichik (oshiring yoki so'rovni optimizatsiya qiling — 2.10)Misol 2 — Ko'p instansiya hisobi (2.5)
DB max_connections = 100
PgBouncer'siz hisob:
Instansiyalar soni × pool hajmi ≤ max_connections (ehtiyot bilan)
Masalan: 8 instansiya × 10 pool = 80 (≤ 100 — OK, zaxira bilan)
8 instansiya × 20 pool = 160 (> 100 — "too many connections"!)
pool hajmini kamaytiring (8 × 10 = 80) yoki PgBouncer (2.6)Misol 3 — PgBouncer config (ulkan masshtab — 2.6)
; pgbouncer.ini (oneuptime — soddalashtirilgan)
[databases]
mydb = host=localhost port=5432 dbname=mydb
[pgbouncer]
pool_mode = transaction ; transaction rejimi (eng samarali)
max_client_conn = 5000 ; minglab client (2.6)
default_pool_size = 25 ; DB'ga kam ulanish (2.6)
min_pool_size = 5
reserve_pool_size = 10
; 5000 client 25 DB ulanish (multiplexing — 2.6)Ilova PgBouncer'ga ulanadi (5432 o'rniga 6432), PgBouncer DB'ga kam ulanish bilan. Minglab client o'nlab DB ulanish (oneuptime).
Misol 4 — Entity va atribut aniqlash (ER — 2.9)
Talab: "Foydalanuvchilar mahsulotlarni savatga qo'shib buyurtma beradi.
Har buyurtma yetkazib berish manziliga ega."
Entity'lar (otlar — 2.9):
- User (foydalanuvchi)
- Product (mahsulot)
- Order (buyurtma)
- Address (manzil)
- CartItem / OrderItem (savat/buyurtma elementi)
Atributlar:
User: id(PK), ism, email, parol, created_at
Product: id(PK), nom, narx, zaxira, category_id(FK)
Order: id(PK), user_id(FK), address_id(FK), holat, summa, created_atMisol 5 — Bog'lanishlar va cardinality (2.10)
Bog'lanishlarni aniqlash (fe'llardan — 2.10):
User 1:N Order (foydalanuvchi ko'p buyurtma; buyurtma bir foydalanuvchi)
User 1:N Address (foydalanuvchi ko'p manzil)
Category 1:N Product (kategoriya ko'p mahsulot)
Order M:N Product (buyurtma ko'p mahsulot, mahsulot ko'p buyurtmada)
OrderItem junction (order_id, product_id, miqdor, narx)
Order N:1 Address (buyurtma bir yetkazish manzili)Misol 6 — ER SQL jadval (2.12)
-- ER diagrammadan jadvalga (2.12)
CREATE TABLE users (
id SERIAL PRIMARY KEY, ism VARCHAR(50), email VARCHAR(100) UNIQUE
);
CREATE TABLE categories (id SERIAL PRIMARY KEY, nom VARCHAR(50));
CREATE TABLE products (
id SERIAL PRIMARY KEY, nom VARCHAR(100), narx DECIMAL(10,2), zaxira INT,
category_id INT REFERENCES categories(id) -- 1:N (2.10)
);
CREATE TABLE addresses (
id SERIAL PRIMARY KEY, user_id INT REFERENCES users(id) ON DELETE CASCADE, -- 1:N
shahar VARCHAR(50), kocha VARCHAR(100)
);
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
user_id INT REFERENCES users(id), -- 1:N (2.10)
address_id INT REFERENCES addresses(id), -- N:1
holat VARCHAR(20) DEFAULT 'yangi', summa DECIMAL(10,2)
);
CREATE TABLE order_items ( -- M:N junction (2.11)
order_id INT REFERENCES orders(id) ON DELETE CASCADE,
product_id INT REFERENCES products(id),
miqdor INT, narx DECIMAL(10,2), -- snapshot (6.3)
PRIMARY KEY (order_id, product_id)
);
-- Indekslar (6.10)
CREATE INDEX idx_orders_user ON orders(user_id);
CREATE INDEX idx_products_category ON products(category_id);Misol 7 — dbdiagram.io notatsiyasi (ER kod bilan — 2.13)
// dbdiagram.io DSL (ER ni kod bilan — 2.13)
Table users {
id int [pk, increment]
email varchar [unique]
}
Table orders {
id int [pk, increment]
user_id int [ref: > users.id] // 1:N (orders.user_id users.id)
summa decimal
}
Table products { id int [pk]; nom varchar }
Table order_items {
order_id int [ref: > orders.id] // M:N junction 2.11-bob
product_id int [ref: > products.id]
miqdor int
}
// > : many-to-one; - : one-to-one; <> : many-to-manyMisol 8 — Pool + ER birga (to'liq backend — 2.15)
// To'liq: optimal pool + ER asosli modellar (6-QISM xulosasi)
import pg from "pg";
const pool = new pg.Pool({ connectionString: process.env.DATABASE_URL, max: 10 }); // pool (2.3)
// ER bog'lanishlari asosida so'rov (1:N, M:N — JOIN — 6.7)
export async function buyurtmaToliq(orderId) {
const { rows } = await pool.query(`
SELECT o.id, o.summa, u.ism AS mijoz, a.shahar,
json_agg(json_build_object('nom', p.nom, 'miqdor', oi.miqdor)) AS mahsulotlar
FROM orders o
JOIN users u ON o.user_id = u.id -- 1:N 2.10-bob
JOIN addresses a ON o.address_id = a.id -- N:1
JOIN order_items oi ON oi.order_id = o.id -- M:N junction 2.11-bob
JOIN products p ON oi.product_id = p.id
WHERE o.id = $1
GROUP BY o.id, u.ism, a.shahar
`, [orderId]); // parametrli (14)
return rows[0];
}
// ER (struktura) + pool (samarali ulanish) + JOIN (bog'lanish) — hammasi birga5. To'g'ri va noto'g'ri holatlar
1) Har so'rovda yangi ulanish
createConnection har so'rovda (sekin, chegara — 2.1)
pool (qayta ishlatish — 2.2)2) Juda katta pool
// "ko'proq = tezroq" (noto'g'ri — DB sekinlashadi — 2.3)
new Pool({ max: 100 });
// optimal (cpu*2)
new Pool({ max: 10 });3) Ko'p instansiya, pool hisobsiz
10 instansiya × 20 pool = 200 > DB max (qulaydi — 2.5)
jami ≤ max; yoki PgBouncer (2.6)4) ER'siz to'g'ridan jadval yaratish
o'ylamasdan jadval (noto'g'ri bog'lanish — qayta yozish — 2.8)
avval ER modeling (entity/cardinality — 2.13)5) M:N to'g'ridan (junctionsiz)
M:N ni FK bilan ifodalashga urinish (imkonsiz — 2.11)
junction jadval (OrderItem)6. Keng tarqalgan xatolar va yechimlari
Xato 1 — too many connections / remaining connection slots
Sababi: ulanishlar DB max'dan oshdi (pool katta yoki release yo'q — 2.5). Yechimi: pool hajmini kamaytiring; release tekshiring (6.5: 2.10); PgBouncer 2.6-bob.
Xato 2 — connection timeout (pool to'la)
Sababi: pool kichik, so'rovlar kutadi 2.3-bob. Yechimi: pool hajmini moslab oshiring; sekin so'rovlarni optimizatsiya qiling 6.10-bob; release.
Xato 3 — Ulanish "leak" (oshib boradi)
Sababi: ulanish qaytarilmagan (release/end yo'q — 6.5: 2.10). Yechimi: finally'da release; ORM avtomatik.
Xato 4 — Noto'g'ri DB dizayni (keyin muammo)
Sababi: ER modelingsiz, shoshib jadval 2.8-bob. Yechimi: ER modeling (qaytadan loyihalash); migration bilan to'g'rilash 6.14-bob.
Xato 5 — M:N bog'lanish noto'g'ri
Sababi: junction jadval yo'q 2.11-bob. Yechimi: junction (ikki FK + qo'shimcha maydon).
Xato 6 — Cardinality noto'g'ri tanlangan
Sababi: 1:N yoki M:N noto'g'ri baholangan 2.10-bob. Yechimi: talabni qayta tahlil; to'g'ri cardinality; ER qayta.
7. Integratsiya — bu mavzu stack'ning qayerida uchraydi
- MySQL/PostgreSQL (6.5, 6.6): pool (mysql2/pg).
- ORM'lar (6.11-6.13): pool ichida; ER model.
- Normalizatsiya 6.9-bob: ER modeling asosi.
- Relations 6.1-bob: cardinality, FK.
- JOIN 6.7-bob: ER bog'lanishlari.
- Query optimization 6.10-bob: pool, indeks rejasi.
- Migration 6.14-bob: ER o'zgarishi.
- DevOps 10.2-bob: ko'p instansiya, PgBouncer.
- Arxitektura (9): masshtab, scalability.
- Cloud DB 10.6-bob: managed pooler.
8. Eng yaxshi amaliyotlar (best practices)
- Pool optimal hajm (cpu*2 atrofida — juda katta emas — 2.3).
- Ulanishni qaytar (release; ORM avtomatik — 6.5: 2.10).
- Ko'p instansiya: jami ulanish ≤ DB max 2.5-bob.
- Ulkan masshtab: PgBouncer 2.6-bob; pool monitoring (waiting clients — 2.10).
- ER modeling kod oldidan (entity/atribut/cardinality — 2.8-2.13).
- To'g'ri cardinality (1:N FK, M:N junction — 2.10, 2.11).
- Normalizatsiya (3NF) + tanlab denormalizatsiya 6.9-bob.
- Aniq nomlash, FK + yaxlitlik, indeks rejasi (2.14, 6.6, 6.10).
- Diagramma vositasi (dbdiagram.io — 2.13); kelajakni o'yla (migration — 6.14).
- ER jadval qoidalari bo'yicha 2.12-bob.
9. Amaliy loyiha: "To'liq DB Dizayni (ER Jadval Pool)"
6-QISMni yakunlovchi loyiha — DB dizaynini boshidan oxirigacha.
Maqsad
Murakkab ilova (e-commerce yoki ijtimoiy tarmoq) uchun to'liq DB dizaynini qurish: ER modeling, jadvalga o'tkazish, indeks rejasi va optimal pool.
Talablar (requirements)
- Talab tahlili: ilova talablarini yozing (biznes — 2.13).
- Entity/atribut: entity'larni (otlar) va atributlarni aniqlang (Misol 4, 2.9).
- Cardinality: bog'lanishlar (1:1, 1:N, M:N) va optionality (Misol 5, 2.10).
- ER diagramma: dbdiagram.io yoki ASCII bilan chizing (Misol 7, 2.13).
- Normalizatsiya: 3NF tekshiring (takror yo'q — 6.9).
- Jadvalga o'tkazish: SQL (PK/FK/junction — Misol 6, 2.12).
- Indeks rejasi: tez-qidiriladigan/JOIN ustunlari 6.10-bob.
- Pool sozlash: optimal hajm; monitoring (Misol 1, 2.3).
- Ko'p instansiya hisobi: pool × instansiya ≤ max 2.5-bob.
- (Bonus) PgBouncer: ulkan masshtab uchun reja 2.6-bob.
Maslahatlar (hint)
- Entity — otlar; bog'lanish — fe'llar (2.9, 2.10).
- M:N junction jadval (2.11, 5-xato).
- ER jadval qoidalari 2.12-bob.
- Pool: cpu*2 atrofida (2.3, 2-xato).
- Ko'p instansiya: jami ≤ max (2.5, 3-xato).
- 3NF 6.9-bob; indeks 6.10-bob.
"Tayyor" mezonlari (acceptance criteria)
- Talab tahlili + entity/atribut.
- Cardinality (1:N, M:N) to'g'ri.
- ER diagramma chizilgan.
- 3NF normalizatsiya.
- SQL jadvallar (PK/FK/junction).
- Indeks rejasi.
- Optimal pool + monitoring.
- Ko'p instansiya hisobi.
- (Bonus) PgBouncer rejasi.
Yechim kodi ataylab berilmagan — bu loyihani o'zingiz yozib ko'ring.
10. Xulosa va keyingi QISMga ko'prik
Bu bobda 6-QISMni yakunlovchi ikki mavzuni o'rgandik:
- Connection pooling: DB ulanishi qimmat resurs 2.1-bob; pool qayta ishlatadi 2.2-bob; optimal hajm (cpu*2 — juda katta emas — 2.3); ko'p instansiya hisobi 2.5-bob; PgBouncer (ulkan masshtab — 2.6).
- ER modeling: entity/atribut/relationship 2.8-bob; entity aniqlash (otlar — 2.9); cardinality (1:1/1:N/M:N — 2.10); junction (M:N — 2.11); ER jadval 2.12-bob; jarayon 2.13-bob; dizayn prinsiplari 2.14-bob.
6-QISM (Ma'lumotlar bazasi) TUGADI! DB asoslari (SQL vs NoSQL) MongoDB (CRUD, aggregation, relations) SQL (CRUD, JOIN, window, stored procedures) normalizatsiya/ACID/indeks/optimizatsiya ORM'lar (Sequelize, Prisma, TypeORM) migration/seeding connection pool/ER modeling — to'liq, professional DB bilimi.
Keyingi — 7-QISM: TypeScript. JavaScript'ni (2-QISM) va backend (5), DB (6) ni bildik. Ko'p joyda (Prisma — 6.12, TypeORM — 6.13, NestJS — 8) TypeScript'ni ko'rdik. Endi uni chuqur, boshidan o'rganamiz: nega TS, turlar, interface, generics, utility types, decorators. Bu — zamonaviy backend (NestJS — 8) va frontend (React — 11) uchun zarur poydevor.
Foydalanilgan rasmiy/ishonchli manbalar
- pgbouncer.org — PgBouncer config; OneUptime — connection pooling with PgBouncer 2026
- Lucidchart / SmartDraw — Entity Relationship Diagram (ERD); Gleek — ER cardinality
- MojoAuth — connection pooling strategies; Miro — many-to-many in ER diagrams
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!