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)
| Type | Description | Examples |
|---|---|---|
| SQL (Relational) | Structured tables with rows/columns, strict schema, ACID compliance | MySQL, PostgreSQL, SQLite, MSSQL |
| NoSQL (Document) | Flexible schema, JSON-like documents, horizontal scaling | MongoDB, CouchDB, DynamoDB |
Karşılaştırma Tablosu (Comparison Table)
| Feature | MySQL | PostgreSQL | SQLite | MSSQL | MongoDB |
|---|---|---|---|---|---|
| Type | Relational | Relational | Relational | Relational | Document (NoSQL) |
| License | GPL v2 | PostgreSQL (MIT-like) | Public Domain | Commercial | SSPL |
| Default Port | 3306 | 5432 | N/A (file) | 1433 | 27017 |
| Max DB Size | 256 TB | Unlimited | 281 TB | 524 PB | Unlimited |
| JSON Support | JSON type | JSONB (binary, indexed) | JSON functions | JSON type | Native |
| Full-text Search | FULLTEXT index | tsvector + GIN | FTS5 extension | Full-text catalog | Text index |
| Replication | Primary-Replica | Streaming + Logical | N/A | Always On | Replica Set |
| Best For | Web apps, CMS | Analytics, GIS, complex queries | Embedded, mobile, dev | Enterprise, .NET | Real-time, flexible schema |
| ACID | Yes (InnoDB) | Yes | Yes | Yes | Yes (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)
| Feature | Eloquent (Laravel) | Entity Framework (.NET) | Prisma (Node.js) | SQLAlchemy (Python) | Django ORM |
|---|---|---|---|---|---|
| Language | PHP | C# | TypeScript/JS | Python | Python |
| Pattern | Active Record | Data Mapper / DbContext | Schema-first | Unit of Work | Active Record |
| Migration | Built-in | EF Migrations | Prisma Migrate | Alembic | Built-in |
| Raw SQL | DB::select() | FromSqlRaw() | $queryRaw | session.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=secret123php
// 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
| Operation | MySQL | PostgreSQL | SQLite | MSSQL |
|---|---|---|---|---|
| Auto ID | AUTO_INCREMENT | SERIAL / GENERATED ALWAYS AS IDENTITY | AUTOINCREMENT | IDENTITY(1,1) |
| Current time | NOW() | NOW() / CURRENT_TIMESTAMP | datetime('now') | GETDATE() / SYSDATETIME() |
| Limit rows | LIMIT 10 | LIMIT 10 | LIMIT 10 | TOP 10 / OFFSET..FETCH |
| Upsert | ON DUPLICATE KEY UPDATE | ON CONFLICT DO UPDATE | ON CONFLICT DO UPDATE | MERGE |
| Boolean | TINYINT(1) | BOOLEAN | INTEGER (0/1) | BIT |
| String concat | CONCAT(a,b) | a || b | a || b | CONCAT(a,b) / a + b |
| If null | IFNULL(a,b) | COALESCE(a,b) | IFNULL(a,b) | ISNULL(a,b) |
| JSON type | JSON | JSONB | TEXT | NVARCHAR(MAX) |
| Substring | SUBSTRING(s,1,3) | SUBSTRING(s,1,3) | SUBSTR(s,1,3) | SUBSTRING(s,1,3) |
| Table exists | SHOW TABLES LIKE 't' | \dt / pg_tables | .tables | INFORMATION_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 silConnection String Formatları (Connection String Formats)
| Database | Format |
|---|---|
| MySQL | mysql://user:pass@host:3306/dbname |
| PostgreSQL | postgresql://user:pass@host:5432/dbname |
| SQLite | sqlite:///path/to/database.db |
| MSSQL | Server=host;Database=dbname;User Id=user;Password=pass; |
| MongoDB | mongodb://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/myappSon 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)
| Terim | Açıklama | Örnek |
|---|---|---|
| SQL | Structured Query Language — ilişkisel veritabanı sorgu dili | SELECT * FROM users WHERE id = 1 |
| NoSQL | İlişkisel olmayan veritabanları — esnek şema | MongoDB, Redis, Cassandra |
| CRUD | Create, Read, Update, Delete — temel veri işlemleri | INSERT, SELECT, UPDATE, DELETE |
| Primary Key (PK) | Tablodaki her satırı benzersiz tanımlayan sütun | id INT PRIMARY KEY |
| Foreign Key (FK) | Başka tabloya referans veren sütun — ilişki kurar | user_id REFERENCES users(id) |
| Index | Sorgu hızını artırmak için oluşturulan arama yapısı | B-tree, Hash, GIN, Full-text |
| JOIN | Birden fazla tabloyu birleştirerek sorgulama | INNER JOIN, LEFT JOIN, RIGHT JOIN |
| Transaction | Birden fazla işlemi atomik yapma — ya hepsi ya hiçbiri | BEGIN → COMMIT / ROLLBACK |
| ACID | Atomicity, Consistency, Isolation, Durability — veri güvenilirliği | Transaction garantileri |
| Schema | Veritabanı yapısı tanımı — tablolar, sütunlar, tipler | CREATE TABLE users (...) |
| Migration | Şema değişikliklerini kod olarak yönetme ve versiyonlama | php artisan migrate, Alembic |
| Seeding | Test/demo verileri ile veritabanını doldurma | Factory, Faker kütüphaneleri |
| ORM | Object-Relational Mapping — tablo ↔ sınıf eşleştirme | Eloquent, Prisma, Django ORM |
| Query Builder | SQL yazmadan programatik sorgu oluşturma | DB::table('users')->where(...) |
| Stored Procedure | Veritabanında saklanan önceden derlenmiş SQL fonksiyonu | CALL calculate_total(order_id) |
| Trigger | Belirli olay gerçekleştiğinde otomatik çalışan SQL | INSERT sonrası log kaydı |
| View | Sanal tablo — karmaşık sorguyu basitleştirme | CREATE VIEW active_users AS ... |
| Materialized View | Fiziksel olarak saklanan view — hızlı okuma, periyodik güncelleme | Raporlama tabloları |
| Normalization | Veri tekrarını azaltmak için tabloları bölme (1NF, 2NF, 3NF) | Adres bilgisini ayrı tabloya al |
| Denormalization | Performans için bilerek veri tekrarı ekleme | Sık okunan verileri birleştirme |
| Replication | Veritabanını birden fazla sunucuya kopyalama | Master-Slave, Read Replica |
| Sharding | Veriyi yatay olarak parçalara bölme — büyük ölçek | MongoDB sharding, partition by hash |
| Connection Pooling | Veritabanı bağlantılarını yeniden kullanma — performans | pgBouncer, HikariCP |
| Soft Delete | Veriyi silmek yerine deleted_at ile işaretleme | Geri dönüşüm kutusu mantığı |
| N+1 Problem | Her kayıt için ayrı sorgu çalışma hatası | Eager loading ile çözülür |
| Full-text Search | Metin içinde hızlı arama yapma özelliği | MATCH ... AGAINST, tsvector |
| TTL | Time To Live — verinin otomatik silinme süresi | Redis key expiry, MongoDB TTL index |
| Aggregation | Verileri gruplama ve hesaplama (SUM, COUNT, AVG) | GROUP BY, MongoDB pipeline |
| CTE | Common Table Expression — okunabilir alt sorgu | WITH active AS (...) SELECT ... |
| Window Function | Satır bazlı hesaplama — GROUP BY olmadan | ROW_NUMBER(), RANK(), LAG() |