
Prisma ORM ile Veritabanı Yönetimi: Next.js ve Node.js Rehberi
Prisma ORM kurulumu ve kullanımı. Schema tanımlama, migration yönetimi, CRUD operasyonları, ilişkiler ve Next.js entegrasyonu.
Prisma ORM ile Veritabanı Yönetimi
Prisma, modern JavaScript/TypeScript uygulamaları için tip güvenli bir ORM (Object-Relational Mapping) aracıdır. MySQL, PostgreSQL, SQLite ve MongoDB ile çalışır.
Prisma'nın Avantajları
- Type-safe: TypeScript entegrasyonu, otomatik tip oluşturma
- Auto-completion: IDE'de sorgu otomatik tamamlama
- Migration: Schema değişikliklerini takip eder
- Prisma Studio: Görsel veritabanı yöneticisi
- Performans: Optimize edilmiş sorgular
Kurulum
npm install prisma --save-dev
npm install @prisma/client
# Prisma başlat
npx prisma init
# Veya SQLite ile
npx prisma init --datasource-provider sqlite
Oluşturulan dosyalar:
prisma/schema.prisma→ Veri modeli.env→ Database URL
Schema Tanımlama
// prisma/schema.prisma
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql" // mysql, sqlite, mongodb
url = env("DATABASE_URL")
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
password String
role Role @default(USER)
posts Post[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([email])
}
model Post {
id Int @id @default(autoincrement())
title String
slug String @unique
content String?
published Boolean @default(false)
author User @relation(fields: [authorId], references: [id])
authorId Int
tags Tag[]
createdAt DateTime @default(now())
@@index([slug])
}
model Tag {
id Int @id @default(autoincrement())
name String @unique
posts Post[]
}
enum Role {
USER
ADMIN
EDITOR
}
Migration Yönetimi
# Migration oluştur ve uygula
npx prisma migrate dev --name ilk_migration
# Production'da sadece uygula
npx prisma migrate deploy
# Migration durumu
npx prisma migrate status
# Migration sıfırla (sadece geliştirme)
npx prisma migrate reset
# Prisma Client güncelle
npx prisma generate
Prisma Client Kullanımı
CRUD Operasyonları:
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
// CREATE
const yeniKullanici = await prisma.user.create({
data: {
email: 'ahmet@sitem.com',
name: 'Ahmet Yılmaz',
password: 'hash_edilmis_sifre',
},
});
// READ - Tek kayıt
const kullanici = await prisma.user.findUnique({
where: { email: 'ahmet@sitem.com' },
include: { posts: true }, // İlişkili veriler
});
// READ - Çok kayıt
const yazilar = await prisma.post.findMany({
where: {
published: true,
author: { role: 'EDITOR' },
},
orderBy: { createdAt: 'desc' },
take: 10, // LIMIT
skip: 0, // OFFSET
select: { // Projeksiyon
id: true,
title: true,
author: { select: { name: true } },
},
});
// UPDATE
const guncellenen = await prisma.post.update({
where: { id: 1 },
data: { published: true },
});
// UPSERT
const upsert = await prisma.user.upsert({
where: { email: 'ahmet@sitem.com' },
update: { name: 'Ahmet Güncellendi' },
create: {
email: 'ahmet@sitem.com',
name: 'Ahmet Yılmaz',
password: 'hash',
},
});
// DELETE
await prisma.post.delete({ where: { id: 5 } });
await prisma.post.deleteMany({ where: { published: false } });
Filtreleme:
// Çeşitli filtreler
const posts = await prisma.post.findMany({
where: {
title: { contains: 'linux', mode: 'insensitive' },
createdAt: { gte: new Date('2026-01-01') },
authorId: { in: [1, 2, 3] },
NOT: { published: false },
},
});
Transaction:
// Atomik işlem
const [siparis, stok] = await prisma.$transaction([
prisma.order.create({ data: { userId: 1, total: 150 } }),
prisma.product.update({
where: { id: 5 },
data: { stock: { decrement: 1 } },
}),
]);
// Interactive transaction
await prisma.$transaction(async (tx) => {
const stok = await tx.product.findUnique({ where: { id: 5 } });
if (stok.stock < 1) throw new Error('Stok yok');
await tx.order.create({ data: { productId: 5, userId: 1 } });
await tx.product.update({
where: { id: 5 },
data: { stock: { decrement: 1 } },
});
});
Next.js Entegrasyonu
// lib/prisma.ts - Singleton pattern
import { PrismaClient } from '@prisma/client';
const globalForPrisma = global as unknown as { prisma: PrismaClient };
export const prisma =
globalForPrisma.prisma ||
new PrismaClient({ log: ['query'] });
if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma;
// app/api/posts/route.ts (Next.js 13+ App Router)
import { prisma } from '@/lib/prisma';
import { NextResponse } from 'next/server';
export async function GET() {
const posts = await prisma.post.findMany({
where: { published: true },
include: { author: { select: { name: true } } },
orderBy: { createdAt: 'desc' },
take: 10,
});
return NextResponse.json(posts);
}
export async function POST(request: Request) {
const body = await request.json();
const post = await prisma.post.create({ data: body });
return NextResponse.json(post, { status: 201 });
}
Prisma Studio
# Görsel veritabanı yöneticisi
npx prisma studio
# Tarayıcıda: http://localhost:5555
Seed (Başlangıç Verisi)
// prisma/seed.ts
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
async function main() {
await prisma.user.createMany({
data: [
{ email: 'admin@sitem.com', name: 'Admin', password: 'hash', role: 'ADMIN' },
{ email: 'editor@sitem.com', name: 'Editor', password: 'hash', role: 'EDITOR' },
],
skipDuplicates: true,
});
console.log('Seed tamamlandı!');
}
main()
.catch(console.error)
.finally(() => prisma.$disconnect());
// package.json
{
"prisma": {
"seed": "ts-node prisma/seed.ts"
}
}
npx prisma db seed
Büyükweb hosting üzerinde Next.js uygulamanızı Prisma ile MySQL veya PostgreSQL'e bağlayarak production-ready bir backend oluşturabilirsiniz.
Veritabani Performans Optimizasyonu
Veritabani web uygulamalarinin kalbidir.
MySQL/MariaDB Tuning
innodb_buffer_pool_size'i RAM'in %60-70'ine ayarlayin. slow_query_log ile yavas sorgulari tespit edin. max_connections optimize edin.
Indeksleme
WHERE, JOIN, ORDER BY sutunlarina indeks ekleyin. EXPLAIN ile sorgu planlari analiz edin. Composite index kullanin.
Baglanti Havuzu
ProxySQL ile gelismis baglanti yonetimi. Connection pooling ile maliyet azaltma. Persistent connections kullanin.
Replikasyon
Master-Slave ile okuma yukunu dagitin. Galera Cluster ile multi-master yuksek erisilebilirlik. Semi-senkron replikasyon degerlendirin.
Yedekleme
mysqldump mantiksal, xtrabackup fiziksel yedek. Binary log ile point-in-time recovery. Incremental yedekleme ile tasarruf.
Sik Sorulan Sorular
MySQL mi PostgreSQL mi?
MySQL cogu web uygulamasi ile uyumlu. PostgreSQL gelismis veri tipleri ve JSON icin ideal. CMS'ler genelde MySQL kullanir.
Veritabanim buyudu ne yapmaliyim?
Gereksiz verileri temizleyin, tablo optimize edin, arsivleme yapin, partitioning kullanin.
Ne siklikla yedek almaliyim?
Kritik veritabanlari saatlik, standart siteler gunluk. Buyuk degisikliklerden once manuel yedek.
Sonuc
Veritabani optimizasyonu uygulama performansini dogrudan etkiler. Indeksleme, tuning ve yedekleme ile veri katmaninizi guclendirin.
Veritabani Boyut Yonetimi
Buyuk Tablolar icin Stratejiler
- Partitioning: Tarihe gore tablolari bolumlendirin. Sorgu performansi artar.
- Arsivleme: Eski verileri arsiv tablolarina tasiyin.
- Sikistirma: InnoDB sikistirmasi ile disk kullanimini %50-75 azaltin.
WordPress Veritabani Optimizasyonu
- wp_options autoload: Gereksiz autoload kayitlari temizleyin.
- Post revisions: wp-config.php'de WP_POST_REVISIONS sinirlayin.
- Transient veriler: Suresi dolmus verileri duzenli temizleyin.
- Spam yorumlar: Toplu silin.
Veritabani Guvenlik
- Varsayilan portu degistirin
- Uygulama bazli kullanici olusturun
- Minimum gerekli yetki verin
- SSL ile baglanti sifreleyin
- Duzenli guvenlik taramasi yapin
Hosting ve Sunucu Terimleri Sozlugu
| Terim | Aciklama |
|---|---|
| VDS | Virtual Dedicated Server - Sanal ozel sunucu |
| NVMe SSD | Non-Volatile Memory Express - En hizli disk teknolojisi |
| LiteSpeed | Yuksek performansli web sunucu yazilimi |
| CloudLinux | Paylasimli hosting icin kaynak izolasyon isletim sistemi |
| cPanel | Populer web hosting kontrol paneli |
| Plesk | Web hosting ve sunucu yonetim paneli |
| KVM | Kernel-based Virtual Machine - Tam sanallastirma teknolojisi |
| DDoS | Distributed Denial of Service - Dagitik hizmet engelleme saldirisi |
| SSL/TLS | Veri iletisimini sifreleyen guvenlik protokolu |
| TTFB | Time to First Byte - Sunucu yanit suresi |
| CDN | Content Delivery Network - Icerik dagitim agi |
| WAF | Web Application Firewall - Web uygulama guvenligi duvari |
| IOPS | Input/Output Operations Per Second - Disk performans olcusu |
| Uptime | Sunucunun kesintisiz calisma suresi yuzdesi |
| Bandwidth | Veri transfer kapasitesi |
Bu terimleri anlamak, hosting ve sunucu hizmetlerini daha bilinçli secmenize yardimci olur. Detayli bilgi icin Buyukweb blog yazilarini takip edin veya teknik destek ekibimize danisIn.
Etiketler:

