Buyukweb
Prisma ORM ile Veritabanı Yönetimi: Next.js ve Node.js Rehberi

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.

Büyükweb Teknik Ekibi14 Ekim 20247 dakika okuma

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:

#node.js#prisma#veritabanı#database#veri yönetimi

Bu yazıyı paylaş