ORM vs Query Builder
ORM (Object-Relational Mapping) — jaise, Prisma, Sequelize, TypeORM — DATABASE, TABLES, ko, JavaScript, OBJECTS/CLASSES, ki, TARAH, TREAT, karte, HAIN. RAW, SQL, LIKHNE, ki, ZAROORAT, KAAFI, KAM, ho, jaati hai.
Query, BUILDERS — jaise, Knex.js — SQL, QUERIES, ko, CHAINABLE, JavaScript, METHODS, ke, saath, BUILD, karne, DETE, HAIN — RAW, SQL, se, MORE, READABLE, hai, LEKIN, ORM, ki, TULNA, mein, KAAFI, ZYAADA, SQL-LIKE, THINKING, ZAROORI, hai.
// Prisma (ORM):
const users = await prisma.user.findMany({
where: { age: { gte: 18 } },
include: { posts: true },
});
// Knex (query builder):
const users = await knex("users")
.where("age", ">=", 18)
.select("*");
// Raw SQL:
// SELECT * FROM users WHERE age >= 18- ORM (Prisma, Sequelize) = database tables, ko, objects/classes, ki, tarah, treat, karta hai
- Query builder (Knex) = chainable, methods, se, SQL, build, hota hai
- ORMs, complex, queries, ke, liye, KABHI-KABHI, INEFFICIENT — N+1, problem, ka, RISK
N+1, PROBLEM, TAB, HOTA, hai, jab, EK, LIST, ke, HAR, ITEM, ke, liye, EK, SEPARATE, QUERY, RUN, ho, jaati, hai (jaise, 100, users, ke, POSTS, FETCH, karne, ke, liye, 100, ALAG, QUERIES) — INSTEAD, EK, HI, JOIN/IN, QUERY, se, SAB, MIL, sakta hai.
// N+1 problem (BAD):
const users = await prisma.user.findMany();
for (const u of users) {
u.posts = await prisma.post.findMany({ where: { userId: u.id } }); // 100 queries!
}
// Fixed with include (GOOD):
const users = await prisma.user.findMany({ include: { posts: true } }); // 1 queryPrisma, aur, DUSRE, ORMs, RAW, SQL, QUERIES, RUN, karne, ka, ESCAPE, HATCH, DETE, HAIN (jaise, prisma.$queryRaw) — COMPLEX, AGGREGATIONS, YA, PERFORMANCE-CRITICAL, QUERIES, ke, liye, JAHA, ORM, ka, GENERATED, SQL, OPTIMAL, NAHI, hai.