Mundarija (27)
- Bu darsda
- 1. Nega bu kerak?
- 2. Kanon o'lchovlari: avval raqamlar
- 2.1 Bir xil savol — olti kutubxona
- 2.2 Hajm va ishga tushish
- 3. Yetti mezon
- 3.1 Tip xavfsizligi
- 3.2 Migratsiya oqimi
- 3.3 Raw SQL qulayligi
- 3.4 Performance
- 3.5 Serverless va edge
- 3.6 Jamoa tajribasi
- 3.7 Ekotizim holati (2026-10)
- 4. Qaror daraxti
- 5. Og'irlikli baholash
- 5.1 Usul
- 5.2 Sezgirlik
- 6. Loyiha turlari bo'yicha tavsiya
- 7. Ko'p uchraydigan xatolar
- 8. Mashqlar
- 1-mashq (oson)
- 2-mashq (o'rta)
- 3-mashq (qiyin)
- 9. Loyiha qadami
- 10. Real ishda
- Xulosa
- Manbalar
ORM tanlash: Prisma, Drizzle, Kysely, Knex, TypeORM yoki Sequelize
Qisqacha: Tezlik bo'yicha ORM'lar deyarli teng — kanon o'lchovida hammasi 1–4 ms oralig'ida, farqni HTTP va tarmoq yeb yuboradi. Tanlovni hal qiladigan mezonlar boshqa: tip xavfsizligi, migratsiya oqimi, SQL ustidan nazorat, paket hajmi, serverless/edge va jamoa tajribasi. Qisqa qoida: yangi loyihada — Prisma yoki Drizzle, SQL'ni o'zi yozishni yaxshi ko'radigan jamoa — Kysely, eski loyihada — borini (TypeORM, Sequelize, Knex) yaxshi bilib, o'zgarishsiz qoldirish.
Bu darsda
- Yetti mezon bo'yicha ORM'larni solishtira olasiz.
- Kanon o'lchovlarini o'qiysiz: tezlik, hajm, so'rovlar soni,
db pullnimani ko'radi. - Loyiha turiga qarab (startap API, serverless, katta eski kod) tanlov qilasiz va asoslaysiz.
- Og'irlikli baholash jadvalini JavaScript'da hisoblaysiz.
vazifalar-apinega Prisma +pgbilan qolganini tushuntira olasiz.
Oldin bilishingiz kerak: ORM, query builder va raw SQL, Prisma prodakshnda, Drizzle ORM 2: relations va drizzle-kit, Kysely va Knex query builder'lari, TypeORM, Sequelize.
1. Nega bu kerak?
Jasur aka yangi loyiha boshlayapti: "Bahor" oshxonasining buyurtma API'si. Jamoada uch kishi. Sardor deydi: "Prisma oling, hamma shuni ishlatadi". Malika: "Drizzle tezroq, Prisma og'ir". Yangi kelgan Bobur: "Men oldingi ishimda TypeORM ishlatganman".
Kim haq? Har biri o'zicha. Muammo shundaki, uchalasi ham bitta mezon bilan gapiryapti: odatlanganlik, tezlik, tajriba. Tanlov esa bir necha mezonning murosasi. Noto'g'ri tanlangan ORM ikki yildan keyin "ko'chib o'tamiz" degan qimmat loyihaga aylanadi.
O'xshatish: mashina tanlash. Faqat maksimal tezlikka qarab tanlasangiz — shaharda baribir 60 km/soat yurasiz. Muhimi: necha kishi sig'adi, benzin sarfi, ehtiyot qismi topiladimi, usta tuzata oladimi. ORM'da ham "maksimal tezlik" eng kam ahamiyatli mezon chiqadi — buni hozir o'lchov bilan ko'ramiz.
2. Kanon o'lchovlari: avval raqamlar
2.1 Bir xil savol — olti kutubxona
Kanon olti kutubxonani bitta bazada (katta, 500 000 vazifa, egasi 77) uchta bir xil savol bilan o'lchagan. A — faol vazifalar ro'yxati (50 ta), B — o'sha 50 ta + izohlari, C — yangi vazifa yozish (ROLLBACK bilan). Mediana 30 (C — 15), Node 24.21.0, PostgreSQL 18.6:
| Kutubxona | A ms | B ms (SQL soni) | C ms |
|---|---|---|---|
| pg (raw) | 1.00 | 1.34 (1) | 2.41 |
| Drizzle 0.45.4 | 1.08 | 1.61 (1) | 2.47 |
| Kysely 0.29.6 | 1.37 | 2.07 (1) | 2.68 |
| Knex 3.3.0 | 1.09 | 2.30 (2) | 2.87 |
| TypeORM 1.1.2 | 1.25 | 3.78 (2) | 4.26 |
| Sequelize 6.37.8 | 1.17 | 2.03 (1) | 3.02 |
Prisma 7.10.1 boshqa o'lchovda — o'sha baza, lekin VazifaOmbori orqali (Prisma prodakshnda): ro'yxat 50 — pg 3.65, Prisma 4.43 ms. Bu raqamlar A ustuni bilan to'g'ridan-to'g'ri solishtirilmaydi (ombor ko'proq ish qiladi), lekin nisbat ko'rinadi: Prisma pg'dan taxminan 0.8 ms sekin.
Endi kontekst. Kanon jonli API'ni ham o'lchagan (katta, 300 ketma-ket so'rov): GET /v1/vazifalar?limit=50 — 12.9 ms (pg ombori) va 14.1 ms (Prisma ombori). Shundan baza so'rovi 1–5 ms, qolgani — HTTP, Express va JSON (kanon tahlili: ~8–10 ms). Ya'ni ORM farqi umumiy vaqtning kichik ulushi.
Diqqat: Bu — bitta mashinada, bitta o'lchov seriyasi, kichik so'rovlar. Og'ir so'rovlarda (minglab qator, murakkab JOIN) farq kattalashishi mumkin. Lekin u holda ham yechim odatda "ORM almashtirish" emas, "shu bitta so'rovni xom SQL bilan yozish".
2.2 Hajm va ishga tushish
Paket hajmi (node_modules/<paket> papkasi, kanon du -sh):
- pg0,18 MB
- Knex1,4 MB
- Kysely3 MB
- Sequelize3,5 MB
- Drizzle16 MB
- TypeORM28 MB
- @prisma/client72 MB
Manba: IlmHamroh kanon o'lchovi t29-orm va t28-prisma-hajm (du -sh, npm, 2026-10-25)
Prisma bo'yicha batafsil (Prisma prodakshnda): prod o'rnatish (npm ci --omit=dev) — pg bilan 15 MB, Prisma bilan 330 MB; --omit=dev --omit=optional bilan 89 MB. Modul yuklash vaqti — pg bilan 178–195 ms, Prisma bilan 561–620 ms. Jarayonni to'liq ishga tushirish (import + ulanish + o'lchov) — pg 395 ms, Drizzle 862 ms.
Bu raqamlar oddiy serverda (bir marta ishga tushadi, oylab ishlaydi) deyarli ahamiyatsiz. Serverless'da esa har "sovuq start" da qayta to'lanadi — buni "Serverless va edge" mezonida ko'ramiz.
Tekshirib ko'ring: Drizzle paketi 16 MB, Knex — 1.4 MB. Demak Drizzle ilovani 16 MB "og'irlashtiradimi"?
Javob
Shart emas. du -sh papka hajmini o'lchaydi: unda har drayver uchun kod, tur ta'riflari (.d.ts), ESM va CJS nusxalari bor. Ilova faqat import qilgan qismini yuklaydi, bundler esa (serverless'da) faqat ishlatilganini oladi. Ishonchli raqam — jarayon ishga tushish vaqti va xotira, ular yuqorida. Paket hajmi — Docker image va npm ci vaqtiga ta'sir qiladi.
3. Yetti mezon
3.1 Tip xavfsizligi
Savol: "noto'g'ri ustun nomi yoki tur — kompilyatsiyada ushlanadimi?"
- Prisma —
schema.prismadan to'liq tur generatsiya qiladi.selectvaincludega qarab natija turi o'zgaradi. Eng kuchli. - Drizzle — sxema TypeScript kodi, turlar undan chiqariladi (generatsiyasiz). Juda kuchli.
- Kysely —
DBinterfeysi (qo'lda yokikysely-codegenbilan); so'rov quruvchi har ustunni tekshiradi. Kuchli, lekin kanon tuzoqni topdi: trigger to'ldiradiganNOT NULLustun (tartib) sababinsertdaas neverkerak bo'ldi (biz unisql`DEFAULT`bilan yechdik — Kysely va Knex). - TypeORM — entity klasslari bor, lekin
findningselect/relationsnatija turini o'zgartirmaydi (egasidoimFoydalanuvchi, yuklanmagan bo'lsa hamundefined). O'rtacha. - Knex, Sequelize — zaif: Knex'da natija asosan
any, Sequelize modelirequireorqali — tur yo'q.
3.2 Migratsiya oqimi
| Kutubxona | Sxema manbai | Migratsiya |
|---|---|---|
| Prisma | schema.prisma |
migrate dev SQL fayl yasaydi; migrate deploy |
| Drizzle | TS sxema | drizzle-kit generate → SQL; migrate |
| TypeORM | Entity klasslari | migration:generate → TS; synchronize xavfi |
| Sequelize | Migratsiya fayllari | queryInterface JS; tranzaksiyasiz |
| Kysely, Knex | Yo'q (bazaning o'zi) | O'z Migrator i yoki tashqi vosita |
Muhim kuzatuv kanon db pull tajribalaridan. Bizning sxemada CHECK, EXCLUDE, trigger, view, RLS bor. Prisma'ning migrate diff i 15 CHECK dan 0, 8 funksiyadan 0, 6 trigger'dan 0 ni ifodalay oldi. Drizzle-kit pull ko'proq ko'rdi: 10 CHECK, 5 policy, 1 view, 1 MV, generated ustunlar — lekin EXCLUDE, trigger, funksiya — yo'q. Xulosa: Postgres'ning boy imkoniyatlaridan foydalanadigan loyihada hech bir ORM sxemaning to'liq manbai bo'la olmaydi. Kanon shuning uchun SQL fayllarini asosiy manba qildi (keyingi darslarda — Prisma Migrate chuqur).
3.3 Raw SQL qulayligi
Ertami-kechmi ORM yetmaydigan so'rov keladi. Kanon misollari: matn bo'yicha saralash (collation), unnest bilan ommaviy yangilash, groupBy relation orqali.
- Prisma —
$queryRawtagged template (parametrli, xavfsiz); natija turi qo'lda. TypedSQL — sinalmagan. - Drizzle —
sql\…`` istalgan joyda, so'rov quruvchi ichida ham. - Kysely —
sqlshablon, so'rov quruvchi bilan aralashtirish oson. - TypeORM —
query()va QueryBuilder; Sequelize —sequelize.query()+replacements.
3.4 Performance
Yuqorida ko'rdik: A savolida farq 0.08–0.37 ms. Muhimroq — qancha SQL yuboriladi. B savolida TypeORM va Knex ikkitadan so'rov yubordi (TypeORM — DISTINCT naqshi, Knex — relation yo'q, qo'lda ikki so'rov). Prisma include ham alohida so'rovlar yuboradi (IN ($1,$2), Prisma: relations). Har qo'shimcha so'rov — tarmoq aylanishi. Baza boshqa serverda bo'lsa (1–2 ms ping), aynan shu farq sezilarli bo'ladi.
3.5 Serverless va edge
Serverless — kod doimiy serverda emas, har so'rovga (yoki bir guruhiga) qisqa yashaydigan muhitda ishlaydi; har yangi nusxa noldan yuklanadi ("sovuq start"). Edge — foydalanuvchiga yaqin, cheklangan muhit (to'liq Node yo'q, TCP cheklangan). Bu muhitlarni 34-qismda ko'ramiz; hozir faqat ORM nuqtai nazaridan:
- Yuklash vaqti va hajm muhim — kichik paketlar (Drizzle, Kysely) ustun.
- Oddiy TCP ulanish bo'lmasligi mumkin — HTTP drayverlari kerak (Neon serverless drayveri kabi). Drizzle va Kysely ularni qo'llaydi; Prisma 7 driver adapter orqali (kanon: Prisma 7 da Rust query engine yo'q, TS "query compiler" + adapter).
- Bu bandni biz sinamadik — hujjatlar bo'yicha (orm.drizzle.team, prisma.io/docs, 2026-10). Managed xizmatlar (Neon, Supabase) haqida — Managed va serverless Postgres.
3.6 Jamoa tajribasi
Eng kam baholanadigan mezon. Jamoada uch kishi Prisma'ni biladi — Drizzle'ning 0.8 ms ustunligi uch kishining bir oylik o'rganish vaqtiga arzimaydi. Teskarisi ham to'g'ri: SQL'ni yaxshi biladigan jamoa Prisma'ning "SQL'ni yashirish"idan bezor bo'ladi va Kysely'da o'zini erkin his qiladi.
3.7 Ekotizim holati (2026-10)
npm ma'lumotlari bo'yicha (npm view, 2026-10-26):
- Prisma — faol, tez-tez reliz; kursning asosiy tanlovi (kanon — 7.10.1). 2026-10-26 da npm
latestbelgisi8.0.0-rc.27ni ko'rsatdi — reliz nomzodi; yangi katta versiyaga o'tish alohida qaror. - Drizzle — faol, lekin hali
0.x(0.45.4): versiya raqamidagi0— "API o'zgarishi mumkin" degani (Semver). - Kysely —
0.x, barqaror va kichik. Kurs 0.29.6 bilan sinalgan; npm'da 2026-10-17 da 0.29.7 chiqqan (kichik tuzatish). - Knex — 3.x, faol, lekin yangi loyihalar Kysely'ga ko'chmoqda.
- TypeORM — 1.x ga yetdi, faol; NestJS hujjatlarida bor.
- Sequelize — 6.37.8 barqaror;
@sequelize/core7-versiyasi hali7.0.0-alpha.48. Yana bir muqobil — MikroORM (7.2.5), uni biz sinamadik.
Tekshirib ko'ring: Kanon
db pullnatijasiga ko'ra, sxemamiz CHECK va trigger'larga boy. Bu Prisma tanlovini noto'g'ri qiladimi?
Javob
Yo'q. Bu faqat "Prisma sxemasi — to'liq manba emas" degani. Kanon yechimi: migratsiyalar — SQL fayllar (CHECK, trigger, EXCLUDE — hammasi shu yerda), schema.prisma — faqat client uchun tavsif. Prisma'ning tip xavfsizligi va qulay API'si saqlanadi. Xuddi shu muammo Drizzle'da ham bor (EXCLUDE va trigger'ni ko'rmaydi).
4. Qaror daraxti
Mezonlarni bitta oqimga jamlaymiz. Diagrammani yuqoridan pastga o'qing — har savolga "ha" yoki "yo'q":
flowchart TD
A[Loyiha yangimi?] -->|yo'q| B[Borini qoldiring, yaxshi o'rganing]
A -->|ha| C[Jamoa SQL'ni o'zi yozishni xohlaydimi?]
C -->|ha| D[Kysely yoki Drizzle]
C -->|yo'q| E[Serverless / edge asosiymi?]
E -->|ha| F[Drizzle]
E -->|yo'q| G[Prisma]
B --> H[Og'ir so'rovlar — raw SQL]
D --> H
F --> H
G --> HHar yo'lning oxirida bitta umumiy qadam: og'ir, maxsus so'rovlar baribir xom SQL bilan yoziladi. "Hamma narsani ORM'da" degan maqsad — xato.
"Borini qoldiring" — eng ko'p uchraydigan to'g'ri javob. Ishlab turgan TypeORM loyihasini "zamonaviy" deb Prisma'ga ko'chirish — oylar, xatolar va sinovlar. Ko'chish faqat aniq og'riq bo'lsa (masalan synchronize sababli ma'lumot yo'qolgan, yoki turlar yo'qligi sabab xatolar ko'p).
5. Og'irlikli baholash
5.1 Usul
Hissiy bahsni raqamga aylantirish usuli: har mezonga og'irlik (loyiha uchun qanchalik muhim, 1–5) va har kutubxonaga ball (1–5) beriladi. Yakuniy natija — ballar og'irlikka ko'paytirilib qo'shiladi.
Quyidagi ballar — "Bahor" buyurtma API'si uchun bizning bahomiz (o'lchov emas). Siz o'z loyihangiz uchun boshqacha qo'yasiz — usul shunda.
const ogirlik = { tip: 5, migratsiya: 4, sql: 3, hajm: 1, jamoa: 4 };
const ballar = {
Prisma: { tip: 5, migratsiya: 4, sql: 3, hajm: 2, jamoa: 5 },
Drizzle: { tip: 5, migratsiya: 4, sql: 5, hajm: 4, jamoa: 2 },
Kysely: { tip: 4, migratsiya: 2, sql: 5, hajm: 5, jamoa: 2 },
TypeORM: { tip: 3, migratsiya: 3, sql: 3, hajm: 3, jamoa: 3 },
};
function baholash(b) {
let jami = 0;
for (const [mezon, w] of Object.entries(ogirlik)) {
jami += w * b[mezon];
}
return jami;
}
const natija = Object.entries(ballar)
.map(([nom, b]) => [nom, baholash(b)])
.sort((x, y) => y[1] - x[1]);
for (const [nom, jami] of natija) console.log(nom, jami);Konsolda:
Prisma 72
Drizzle 68
Kysely 56
TypeORM 51Prisma oldinda, lekin Drizzle bor-yo'g'i 4 ball orqada. Bunday yaqin natija "ikkalasi ham yaxshi, qaror boshqa narsaga bog'liq" deydi. Endi qaysi og'irlik o'zgarsa g'olib almashishini tekshiramiz.
5.2 Sezgirlik
jamoa og'irligini 4 dan 2 ga tushiramiz (masalan, jamoa yangi, hech kim hech narsani bilmaydi):
const ogirlik = { tip: 5, migratsiya: 4, sql: 3, hajm: 1, jamoa: 2 };
const ballar = {
Prisma: { tip: 5, migratsiya: 4, sql: 3, hajm: 2, jamoa: 5 },
Drizzle: { tip: 5, migratsiya: 4, sql: 5, hajm: 4, jamoa: 2 },
};
for (const [nom, b] of Object.entries(ballar)) {
let jami = 0;
for (const [m, w] of Object.entries(ogirlik)) jami += w * b[m];
console.log(nom, jami);
}Konsolda:
Prisma 62
Drizzle 64Endi Drizzle oldinda. Ya'ni bu loyihada qaror aynan "jamoa nimani biladi" savoliga bog'liq. Og'irlikli jadvalning asosiy foydasi shu: u bahsni to'g'ri savolga olib keladi.
Maslahat: Jadvalni loyihaning
docs/papkasiga qaror yozuvi sifatida saqlang: sana, mezonlar, ballar, tanlov va sababi. Bir yildan keyin "nega Drizzle?" deb so'rashganda javob tayyor. Bu amaliyot — ADR (Architecture Decision Record, arxitektura qarori yozuvi), uni 36-qismda (arxitektura) batafsil ko'ramiz.
6. Loyiha turlari bo'yicha tavsiya
| Loyiha | Tavsiya | Sabab |
|---|---|---|
| Yangi REST/GraphQL API, kichik jamoa | Prisma | Tur, migratsiya, hujjat, ko'p o'rganuvchi |
| Serverless/edge, sovuq start muhim | Drizzle | Kichik, HTTP drayverlar, SQL'ga yaqin |
| Murakkab hisobotlar, SQL kuchli jamoa | Kysely (+ migratsiya vositasi) | SQL ustidan to'liq nazorat, turlar |
| NestJS, Java/C# tajribali jamoa | Prisma yoki TypeORM | NestJS ikkalasini ham qo'llaydi |
| Eski Express + Sequelize/Knex | O'zgartirmang | Ko'chish narxi foydadan katta |
| Postgres imkoniyatlari ko'p (trigger, RLS, EXCLUDE) | Har qanday + SQL migratsiyalar | Hech bir ORM sxemani to'liq ifodalamaydi |
7. Ko'p uchraydigan xatolar
1. Benchmark bilan tanlash. Internetdagi "X ORM 10 barobar tez" maqolasi ko'pincha 1 ms va 0.1 ms ni solishtiradi. Kanon o'lchovida eng sekin va eng tez orasidagi farq so'rov ichida 3 ms dan kam. O'z so'rovingizni, o'z bazangizda o'lchang.
2. "Hamma narsa ORM'da" qoidasi. Natija — findMany + JS'da filtrlash, N+1, yoki 30 qatorlik where obyekti. Og'ir so'rov — xom SQL, parametrlar bilan.
3. ORM'ni sxema manbai deb bilish. db pull/migrate diff CHECK, trigger'larni ko'rmaydi; ORM sxemasidan yasalgan migratsiya ularni yo'qotishi mumkin. Kanon topilmasi: Prisma migrate dev birinchi urinishda indeksni o'chirmoqchi bo'ldi.
4. Ikki ORM aralash. Bir loyihada TypeORM ham, Prisma ham — ikki xil tranzaksiya, ikki hovuz, ikki xil migratsiya jadvali. Ko'chish davrida vaqtincha bo'lishi mumkin, lekin reja bilan.
5. 0.x versiyani mahkamlamaslik. Drizzle, Kysely 0.x — kichik versiya ham API'ni o'zgartirishi mumkin. package.json da aniq versiya va lock fayl.
8. Mashqlar
Yechimlar tekshirilgan (biz ishga tushirdik, Node 24.21.0).
1-mashq (oson)
Uch vaziyat berilgan. Har biriga bittadan kutubxona tanlang va bir gap bilan asoslang.
- (a) 2020-yildan beri ishlab turgan Sequelize'li Express API, yangi endpoint kerak.
- (b) Cloudflare Workers'da ishlaydigan kichik API, baza Neon'da.
- (c) 30 xil hisobot so'rovi bor admin panel, jamoa SQL'ni yaxshi biladi.
Yechim
(a) Sequelize — yangi endpoint mavjud modellar va migratsiyalar bilan. Bitta endpoint uchun ikkinchi ORM qo'shish — ikki hovuz va ikki migratsiya tizimi. (b) Drizzle — kichik, edge muhitda HTTP drayver bilan ishlaydi (hujjat bo'yicha; biz sinamadik). (c) Kysely (yoki Drizzle) — so'rov quruvchi SQL'ning o'zi kabi, turlar bilan; murakkab hisobotlar ORM find obyektlaridan ko'ra o'qiladi.
2-mashq (o'rta)
«Og'irlikli baholash» bo'limidagi kodga Sequelize qatorini qo'shing: { tip: 1, migratsiya: 2, sql: 3, hajm: 4, jamoa: 3 }. Keyin hajm og'irligini 1 dan 5 ga oshiring (serverless loyiha). Qaysi kutubxona birinchi o'ringa chiqadi? Ishora: Object.entries va sort — Obyekt bo'ylab yurish, sort va taqqoslash funksiyasi.
Yechim
const ogirlik = { tip: 5, migratsiya: 4, sql: 3, hajm: 5, jamoa: 4 };
const ballar = {
Prisma: { tip: 5, migratsiya: 4, sql: 3, hajm: 2, jamoa: 5 },
Drizzle: { tip: 5, migratsiya: 4, sql: 5, hajm: 4, jamoa: 2 },
Kysely: { tip: 4, migratsiya: 2, sql: 5, hajm: 5, jamoa: 2 },
TypeORM: { tip: 3, migratsiya: 3, sql: 3, hajm: 3, jamoa: 3 },
Sequelize: { tip: 1, migratsiya: 2, sql: 3, hajm: 4, jamoa: 3 },
};
const baholash = (b) => Object.entries(ogirlik)
.reduce((s, [m, w]) => s + w * b[m], 0);
const natija = Object.entries(ballar)
.map(([nom, b]) => [nom, baholash(b)])
.sort((x, y) => y[1] - x[1]);
for (const [nom, jami] of natija) console.log(nom, jami);Konsolda:
Drizzle 84
Prisma 80
Kysely 76
TypeORM 63
Sequelize 54Hajm muhim bo'lganda Drizzle birinchi o'ringa chiqdi, Prisma ikkinchi, Kysely esa yaqinlashdi (56 → 76). reduce — for siklining qisqa shakli (reduce).
3-mashq (qiyin)
Kanon jadvalidagi B ustuni (vazifa + izohlar) uchun har kutubxona pg'dan necha foiz sekinligini hisoblaydigan funksiya yozing (foizFarq(asos, qiymat) — butun songa yaxlitlang). Natijani kamayish tartibida chiqaring. Keyin bir gap bilan: nima uchun eng sekin ikkitasi aynan TypeORM va Knex?
Yechim
const B = { pg: 1.34, Drizzle: 1.61, Kysely: 2.07, Knex: 2.30,
TypeORM: 3.78, Sequelize: 2.03 };
const foizFarq = (asos, q) => Math.round((q - asos) / asos * 100);
const qatorlar = Object.entries(B)
.filter(([nom]) => nom !== "pg")
.map(([nom, ms]) => [nom, foizFarq(B.pg, ms)])
.sort((x, y) => y[1] - x[1]);
for (const [nom, f] of qatorlar) console.log(`${nom}: +${f}%`);Konsolda:
TypeORM: +182%
Knex: +72%
Kysely: +54%
Sequelize: +51%
Drizzle: +20%TypeORM va Knex — ikkalasi ham ikkita SQL yubordi (TypeORM — relation + take uchun DISTINCT naqshi, Knex — relation tushunchasi yo'q, ikki so'rov qo'lda). Qolganlari bitta so'rov bilan. Foiz katta ko'rinadi, lekin mutlaq farq 2.4 ms dan kam — umumiy API vaqtiga nisbatan kichik.
9. Loyiha qadami
Kanon qarori (o'lchov bilan, holat 20 dan beri amalda): vazifalar-api — Prisma (asosiy, SAQLASH=prisma) + pg (SAQLASH=postgres, taqqoslash va xom SQL). Ikkala ombor bir xil VazifaOmbori shartnoma testlaridan o'tadi va jonli 9/9 so'rovda bir xil HTTP kodlarni beradi. Drizzle va Kysely — eng yaqin muqobil; TypeORM va Sequelize — o'lchangan tuzoqlar sabab yangi loyihaga tavsiya etilmaydi.
Kodga o'zgarish yo'q. O'z repongizda bitta fayl qo'shing — tanlov yozuvi:
mkdir -p docsdocs/orm-tanlovi.md ga: sana, «Og'irlikli baholash» bo'limidagi jadvalning sizning variantingiz, tanlov (Prisma + pg) va 2–3 gaplik sabab (tip xavfsizligi, kurs yo'nalishi, pg — og'ir so'rovlar uchun). Commit:
git add docs/orm-tanlovi.md
git commit -m "docs: ORM tanlovi — Prisma + pg (mezonlar va o'lchov)"10. Real ishda
- Intervyuda tez-tez: "Qaysi ORM ishlatgansiz va nega?" Yaxshi javob — "X, chunki loyihada Y mezon muhim edi; Z da esa shu kamchilik bor edi". Faqat "qulay" deyish — zaif javob.
- Arxitektura review'da yangi kutubxona qo'shish qarori shu mezonlar bilan muhokama qilinadi.
- Ko'chish loyihalari (Sequelize → Prisma) — real ishda uchraydi; odatda modulma-modul, ikki ORM vaqtincha yonma-yon.
- Raw SQL madaniyati — yaxshi jamoalarda "ORM — 90 % CRUD uchun, qolgani — parametrli SQL" kelishuvi yozib qo'yiladi.
Xulosa
- Kanon o'lchovida ORM'lar orasidagi tezlik farqi 1–4 ms; API so'rovining umumiy vaqti 13–14 ms — tezlik hal qiluvchi mezon emas.
- Muhim mezonlar: tip xavfsizligi, migratsiya oqimi, raw SQL qulayligi, yuboriladigan SQL soni, hajm (serverless), jamoa tajribasi, ekotizim holati.
- Hech bir ORM boy Postgres sxemasini (CHECK, trigger, EXCLUDE, RLS) to'liq ifodalamaydi — migratsiya manbai SQL bo'lishi mumkin.
- Og'irlikli baholash bahsni to'g'ri savolga olib keladi; tanlovni qaror yozuvi sifatida saqlang.
- Yangi loyiha — Prisma yoki Drizzle (SQL jamoasi — Kysely); eski loyiha — borini qoldirish.
Keyingi dars: Migratsiya tushunchasi — sxema o'zgarishi nega kod kabi versiyalanadi: migratsiya fayli, holat jadvali, up/down va forward-only.
Manbalar
- Prisma ORM hujjati — Prisma 7, driver adapters: https://www.prisma.io/docs
- Drizzle ORM hujjati — Connect (serverless drayverlar), drizzle-kit: https://orm.drizzle.team/docs
- Kysely hujjati: https://kysely.dev/docs
- npm reestri,
npm view <paket>(2026-10-26). - IlmHamroh kanon o'lchovlari t28-ombor-olchov, t28-prisma-hajm, t29-orm, t30-drizzle-pull, t36-migrate, t58-api-kesh (PostgreSQL 18.6, Node 24.21.0, 2026-10-25).
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!