Skip to content

Veritabanı Rehberi / Database Reference Guide

Comprehensive guide covering MySQL, PostgreSQL, SQLite, MSSQL, and MongoDB. Kurulum, CRUD, sorgular, indeksler, yedekleme ve ORM entegrasyonları.


Genel Bakış (Overview)

Veritabanı Türleri (Database Types)

TypeDescriptionExamples
SQL (Relational)Structured tables with rows/columns, strict schema, ACID complianceMySQL, PostgreSQL, SQLite, MSSQL
NoSQL (Document)Flexible schema, JSON-like documents, horizontal scalingMongoDB, CouchDB, DynamoDB

Karşılaştırma Tablosu (Comparison Table)

FeatureMySQLPostgreSQLSQLiteMSSQLMongoDB
TypeRelationalRelationalRelationalRelationalDocument (NoSQL)
LicenseGPL v2PostgreSQL (MIT-like)Public DomainCommercialSSPL
Default Port33065432N/A (file)143327017
Max DB Size256 TBUnlimited281 TB524 PBUnlimited
JSON SupportJSON typeJSONB (binary, indexed)JSON functionsJSON typeNative
Full-text SearchFULLTEXT indextsvector + GINFTS5 extensionFull-text catalogText index
ReplicationPrimary-ReplicaStreaming + LogicalN/AAlways OnReplica Set
Best ForWeb apps, CMSAnalytics, GIS, complex queriesEmbedded, mobile, devEnterprise, .NETReal-time, flexible schema
ACIDYes (InnoDB)YesYesYesYes (4.0+)

Hangisini Ne Zaman Kullan? (When to Use Which?)

  • MySQL: Web uygulamaları, WordPress, Laravel projeleri, yüksek okuma performansı
  • PostgreSQL: Karmaşık sorgular, JSONB işlemleri, GIS/harita verileri, analitik
  • SQLite: Mobil uygulamalar, prototipleme, embedded sistemler, test ortamları
  • MSSQL: Kurumsal .NET uygulamaları, Windows Server ekosistemi, BI/raporlama
  • MongoDB: Hızlı prototipleme, esnek şema, real-time analytics, IoT veri toplama

ORM Karşılaştırma Tablosu (ORM Comparison Table)

FeatureEloquent (Laravel)Entity Framework (.NET)Prisma (Node.js)SQLAlchemy (Python)Django ORM
LanguagePHPC#TypeScript/JSPythonPython
PatternActive RecordData Mapper / DbContextSchema-firstUnit of WorkActive Record
MigrationBuilt-inEF MigrationsPrisma MigrateAlembicBuilt-in
Raw SQLDB::select()FromSqlRaw()$queryRawsession.execute()raw()

Bağlantı Ayarları (Connection Config)

Eloquent (Laravel / PHP)

bash
# .env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=myapp
DB_USERNAME=appuser
DB_PASSWORD=secret123
php
// Basit CRUD
$users = User::where('age', '>', 25)->orderBy('name')->get();
$user = User::create(['name' => 'Ali', 'email' => 'ali@test.com', 'age' => 28]);
$user->update(['age' => 29]);
$user->delete();

Entity Framework (.NET / C#)

csharp
// appsettings.json
// "ConnectionStrings": { "Default": "Server=localhost;Database=myapp;..." }

// CRUD
var users = db.Users.Where(u => u.Age > 25).OrderBy(u => u.Name).ToList();
db.Users.Add(new User { Name = "Ali", Email = "ali@test.com", Age = 28 });
db.SaveChanges();

Prisma (Node.js / TypeScript)

javascript
// schema.prisma
// datasource db { provider = "postgresql" url = env("DATABASE_URL") }

// CRUD
const users = await prisma.user.findMany({
    where: { age: { gt: 25 } },
    orderBy: { name: 'asc' }
});
const user = await prisma.user.create({
    data: { name: 'Ali', email: 'ali@test.com', age: 28 }
});
await prisma.user.update({ where: { id: 1 }, data: { age: 29 } });
await prisma.user.delete({ where: { id: 1 } });

SQLAlchemy (Python)

python
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base, Session

engine = create_engine('postgresql://appuser:secret123@localhost:5432/myapp')
Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String(100), nullable=False)
    email = Column(String(150), unique=True, nullable=False)
    age = Column(Integer, default=0)

# CRUD
with Session(engine) as session:
    session.add(User(name='Ali', email='ali@test.com', age=28))
    session.commit()
    users = session.query(User).filter(User.age > 25).order_by(User.name).all()

Django ORM

python
# models.py
from django.db import models

class User(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField(unique=True)
    age = models.IntegerField(default=0)

    class Meta:
        db_table = 'users'

# CRUD
User.objects.create(name='Ali', email='ali@test.com', age=28)
users = User.objects.filter(age__gt=25).order_by('name')
User.objects.filter(id=1).update(age=29)
User.objects.filter(id=1).delete()

Hızlı Referans (Quick Reference)

SQL Syntax Karşılaştırma Tablosu

OperationMySQLPostgreSQLSQLiteMSSQL
Auto IDAUTO_INCREMENTSERIAL / GENERATED ALWAYS AS IDENTITYAUTOINCREMENTIDENTITY(1,1)
Current timeNOW()NOW() / CURRENT_TIMESTAMPdatetime('now')GETDATE() / SYSDATETIME()
Limit rowsLIMIT 10LIMIT 10LIMIT 10TOP 10 / OFFSET..FETCH
UpsertON DUPLICATE KEY UPDATEON CONFLICT DO UPDATEON CONFLICT DO UPDATEMERGE
BooleanTINYINT(1)BOOLEANINTEGER (0/1)BIT
String concatCONCAT(a,b)a || ba || bCONCAT(a,b) / a + b
If nullIFNULL(a,b)COALESCE(a,b)IFNULL(a,b)ISNULL(a,b)
JSON typeJSONJSONBTEXTNVARCHAR(MAX)
SubstringSUBSTRING(s,1,3)SUBSTRING(s,1,3)SUBSTR(s,1,3)SUBSTRING(s,1,3)
Table existsSHOW TABLES LIKE 't'\dt / pg_tables.tablesINFORMATION_SCHEMA.TABLES

Docker Compose Örnekleri (Docker Compose Examples)

yaml
# docker-compose.yml -- Tum veritabanlari / All databases
version: '3.8'

services:
  mysql:
    image: mysql:8.0
    container_name: mysql-dev
    environment:
      MYSQL_ROOT_PASSWORD: secret123
      MYSQL_DATABASE: myapp
      MYSQL_USER: appuser
      MYSQL_PASSWORD: apppass
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql

  postgres:
    image: postgres:16
    container_name: postgres-dev
    environment:
      POSTGRES_USER: appuser
      POSTGRES_PASSWORD: secret123
      POSTGRES_DB: myapp
    ports:
      - "5432:5432"
    volumes:
      - pg_data:/var/lib/postgresql/data

  mssql:
    image: mcr.microsoft.com/mssql/server:2022-latest
    container_name: mssql-dev
    environment:
      ACCEPT_EULA: "Y"
      MSSQL_SA_PASSWORD: "Strong!Pass123"
      MSSQL_PID: "Developer"
    ports:
      - "1433:1433"
    volumes:
      - mssql_data:/var/opt/mssql

  mongo:
    image: mongo:7
    container_name: mongo-dev
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: secret123
    ports:
      - "27017:27017"
    volumes:
      - mongo_data:/data/db

volumes:
  mysql_data:
  pg_data:
  mssql_data:
  mongo_data:
bash
# Tum servisleri baslat / Start all services
docker compose up -d

# Tek servis baslat / Start single service
docker compose up -d postgres

# Loglar / Logs
docker compose logs -f mysql

# Durdur ve temizle / Stop and clean
docker compose down
docker compose down -v  # Volumeleri de sil

Connection String Formatları (Connection String Formats)

DatabaseFormat
MySQLmysql://user:pass@host:3306/dbname
PostgreSQLpostgresql://user:pass@host:5432/dbname
SQLitesqlite:///path/to/database.db
MSSQLServer=host;Database=dbname;User Id=user;Password=pass;
MongoDBmongodb://user:pass@host:27017/dbname?authSource=admin
MSSQL (URL)mssql://user:pass@host:1433/dbname

Framework-Specific Connection Strings

bash
# Laravel (.env)
DB_CONNECTION=mysql
DB_URL=mysql://appuser:secret123@127.0.0.1:3306/myapp

# Django (settings.py) -- see PostgreSQL guide for full config

# Node.js (Prisma .env)
DATABASE_URL="postgresql://appuser:secret123@localhost:5432/myapp?schema=public"

# .NET (appsettings.json)
# "Server=localhost;Database=myapp;User Id=sa;Password=Strong!Pass123;TrustServerCertificate=True;"

# Flask
SQLALCHEMY_DATABASE_URI=postgresql://appuser:secret123@localhost:5432/myapp

Son not / Final note: Bu rehber pratik kullanım için hazırlanmıştır. Her veritabanının resmi dokümantasyonunu da incelemeniz tavsiye edilir.


Terim Sözlüğü (Glossary)

TerimAçıklamaÖrnek
SQLStructured Query Language — ilişkisel veritabanı sorgu diliSELECT * FROM users WHERE id = 1
NoSQLİlişkisel olmayan veritabanları — esnek şemaMongoDB, Redis, Cassandra
CRUDCreate, Read, Update, Delete — temel veri işlemleriINSERT, SELECT, UPDATE, DELETE
Primary Key (PK)Tablodaki her satırı benzersiz tanımlayan sütunid INT PRIMARY KEY
Foreign Key (FK)Başka tabloya referans veren sütun — ilişki kuraruser_id REFERENCES users(id)
IndexSorgu hızını artırmak için oluşturulan arama yapısıB-tree, Hash, GIN, Full-text
JOINBirden fazla tabloyu birleştirerek sorgulamaINNER JOIN, LEFT JOIN, RIGHT JOIN
TransactionBirden fazla işlemi atomik yapma — ya hepsi ya hiçbiriBEGIN → COMMIT / ROLLBACK
ACIDAtomicity, Consistency, Isolation, Durability — veri güvenilirliğiTransaction garantileri
SchemaVeritabanı yapısı tanımı — tablolar, sütunlar, tiplerCREATE TABLE users (...)
MigrationŞema değişikliklerini kod olarak yönetme ve versiyonlamaphp artisan migrate, Alembic
SeedingTest/demo verileri ile veritabanını doldurmaFactory, Faker kütüphaneleri
ORMObject-Relational Mapping — tablo ↔ sınıf eşleştirmeEloquent, Prisma, Django ORM
Query BuilderSQL yazmadan programatik sorgu oluşturmaDB::table('users')->where(...)
Stored ProcedureVeritabanında saklanan önceden derlenmiş SQL fonksiyonuCALL calculate_total(order_id)
TriggerBelirli olay gerçekleştiğinde otomatik çalışan SQLINSERT sonrası log kaydı
ViewSanal tablo — karmaşık sorguyu basitleştirmeCREATE VIEW active_users AS ...
Materialized ViewFiziksel olarak saklanan view — hızlı okuma, periyodik güncellemeRaporlama tabloları
NormalizationVeri tekrarını azaltmak için tabloları bölme (1NF, 2NF, 3NF)Adres bilgisini ayrı tabloya al
DenormalizationPerformans için bilerek veri tekrarı eklemeSık okunan verileri birleştirme
ReplicationVeritabanını birden fazla sunucuya kopyalamaMaster-Slave, Read Replica
ShardingVeriyi yatay olarak parçalara bölme — büyük ölçekMongoDB sharding, partition by hash
Connection PoolingVeritabanı bağlantılarını yeniden kullanma — performanspgBouncer, HikariCP
Soft DeleteVeriyi silmek yerine deleted_at ile işaretlemeGeri dönüşüm kutusu mantığı
N+1 ProblemHer kayıt için ayrı sorgu çalışma hatasıEager loading ile çözülür
Full-text SearchMetin içinde hızlı arama yapma özelliğiMATCH ... AGAINST, tsvector
TTLTime To Live — verinin otomatik silinme süresiRedis key expiry, MongoDB TTL index
AggregationVerileri gruplama ve hesaplama (SUM, COUNT, AVG)GROUP BY, MongoDB pipeline
CTECommon Table Expression — okunabilir alt sorguWITH active AS (...) SELECT ...
Window FunctionSatır bazlı hesaplama — GROUP BY olmadanROW_NUMBER(), RANK(), LAG()

Veritabanı (Database)

Diğer Kategoriler (Other Categories)

Developer Guides & Technical References