IlmHamroh
JavaScript Full-stack/27-qism. Ma'lumotlar bazasi chuqur: Postgres, ORM, Mongo, Redis34/65-dars16 daqiqa
Mundarija (27)

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 pull nimani ko'radi.
  • Loyiha turiga qarab (startap API, serverless, katta eski kod) tanlov qilasiz va asoslaysiz.
  • Og'irlikli baholash jadvalini JavaScript'da hisoblaysiz.
  • vazifalar-api nega Prisma + pg bilan 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):

Paketning o'z hajmi
  • 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.prisma dan to'liq tur generatsiya qiladi. select va include ga qarab natija turi o'zgaradi. Eng kuchli.
  • Drizzle — sxema TypeScript kodi, turlar undan chiqariladi (generatsiyasiz). Juda kuchli.
  • Kysely — DB interfeysi (qo'lda yoki kysely-codegen bilan); so'rov quruvchi har ustunni tekshiradi. Kuchli, lekin kanon tuzoqni topdi: trigger to'ldiradigan NOT NULL ustun (tartib) sabab insert da as never kerak bo'ldi (biz uni sql`DEFAULT` bilan yechdik — Kysely va Knex).
  • TypeORM — entity klasslari bor, lekin find ning select/relations natija turini o'zgartirmaydi (egasi doim Foydalanuvchi, yuklanmagan bo'lsa ham undefined). O'rtacha.
  • Knex, Sequelize — zaif: Knex'da natija asosan any, Sequelize modeli require orqali — 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 — $queryRaw tagged template (parametrli, xavfsiz); natija turi qo'lda. TypedSQL — sinalmagan.
  • Drizzle — sql\…`` istalgan joyda, so'rov quruvchi ichida ham.
  • Kysely — sql shablon, 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 latest belgisi 8.0.0-rc.27 ni ko'rsatdi — reliz nomzodi; yangi katta versiyaga o'tish alohida qaror.
  • Drizzle — faol, lekin hali 0.x (0.45.4): versiya raqamidagi 0 — "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/core 7-versiyasi hali 7.0.0-alpha.48. Yana bir muqobil — MikroORM (7.2.5), uni biz sinamadik.

Tekshirib ko'ring: Kanon db pull natijasiga 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 --> H

Har 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.

js
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:

text
Prisma 72
Drizzle 68
Kysely 56
TypeORM 51

Prisma 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):

js
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:

text
Prisma 62
Drizzle 64

Endi 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
js
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:

text
Drizzle 84
Prisma 80
Kysely 76
TypeORM 63
Sequelize 54

Hajm 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
js
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:

text
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:

bash
mkdir -p docs

docs/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:

bash
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).
Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
ORM tanlash: Prisma, Drizzle, Kysely, Knex, TypeORM yoki Sequelize — IlmHamroh