Chapters of Frontend Dev থেকে Full-Stack Backend

Week 2 - Database DepthChapter 13 of 282 min read

Englishবাংলা

Prisma - schema, migration, relation আর N+1 problem

এক জায়গায় schema লেখা, migration-এর শৃঙ্খলা, relation query, N+1 ধরা ও ঠিক করা

Raw SQL লিখতে গেলে একটা যন্ত্রণা আছে - result-এ কোনো type safety নেই। Column-এর নামে ভুল করলে বা field-এর type বদলে গেলে সেটা ধরা পড়ে runtime-এ, user-এর সামনে। Prisma এই জায়গাটায় স্বস্তি দেয়: আপনি একবার schema লিখবেন, Prisma সেখান থেকে type-safe client বানিয়ে দেবে - ভুল query লিখলেই editor-এই লাল দাগ দেখবেন, server চালু হওয়ার আগেই।

// prisma/schema.prisma
model User {
  id     Int     @id @default(autoincrement())
  email  String  @unique
  name   String
  orders Order[]
}

model Order {
  id     Int  @id @default(autoincrement())
  total  Int
  userId Int
  user   User @relation(fields: [userId], references: [id])
}

Migration - database বদলের হিসাবখাতা

Schema বদলালে database-ও বদলাতে হয়। Migration হলো সেই বদলের ধাপে ধাপে লেখা ইতিহাস - কোডের মতোই Git-এ থাকে, team-এর সবাই একই ধাপে একই অবস্থায় পৌঁছায়। হাতে হাতে database বদলালে যেটা হয় (একজনের machine-এ column আছে, আরেকজনের নেই), migration সেই দুঃস্বপ্ন শেষ করে।

npx prisma migrate dev --name add_delivery_zone

// relation সহ data আনা - এক query-তেই
const orders = await prisma.order.findMany({
  include: { user: true, items: true },
});

N+1 problem - এই সপ্তাহের সবচেয়ে দামি শব্দ

দৃশ্যটা এরকম: প্রথমে একটা query-তে ১০০টা order আনলেন। তারপর প্রতিটা order-এর user আনতে গিয়ে আবার ১০০টা আলাদা query। মোট ১০১টা query - অথচ কাজটা ১টা বা ২টা query-তেই হতো। একেই বলে N+1 problem: 1টা মূল query + Nটা অতিরিক্ত। Prisma-তে এর সমাধান হলো উপরের মতো include ব্যবহার করা - Prisma তখন ভেতরে ভেতরে জোড়া লাগিয়ে আনে, আলাদা query ছাড়াই। সমস্যাটা ধরা যায় query log চালু করে - endpoint একবার ডাকলেই যদি শো শো query ছোটে, বুঝবেন N+1 লুকিয়ে আছে।

সবাই যে ভুলটা করে

Loop-এর ভিতরে query চালানো - এটা N+1-এর সবচেয়ে সাধারণ উৎস। আরেকটা ভুল: production database-এ সরাসরি হাতে schema বদলে দেওয়া, migration ছাড়া - তারপর staging আর production-এর গঠন আর মেলে না।

আজকের Practice

আপনার সপ্তাহ ১-এর API-তে Prisma বসান - User আর Order model লিখুন, migration চালান, পুরনো raw query-গুলো Prisma দিয়ে আবার লিখুন। তারপর query log চালু করে দেখুন কোন endpoint-এ অকারণে বেশি query যাচ্ছে কিনা।

Interview-এ কীভাবে বলবেন

Prisma ব্যবহার করি type safety-র জন্য - schema এক জায়গায়, সেখান থেকে তৈরি client ভুল query compile time-এই ধরে দেয়। Migration দিয়ে database-এর বদল ইতিহাসসহ রাখি। আর N+1 আমি এড়াই include দিয়ে relation একসাথে এনে - loop-এর ভিতরে কখনো query চালাই না।

All chapters of Frontend Dev থেকে Full-Stack Backend