Kapsamlı Teknik Rehber

Veri Tabanları:
Derinlemesine Kılavuz

İlişkisel, NoSQL, Key-Value ve Graph veri tabanlarını; komutları, kısaltmaları ve pratik kullanımı ile öğren.

İçindekiler

  1. Veri Tabanı Nedir? DBMS/VTYS Nedir?
  2. Veri Tabanı Türleri: Detaylı Analiz
  3. Komutlar ve İngilizce Kısaltma Sözlüğü
  4. Her Tür İçin Pratik Kullanım Komutları
1

Veri Tabanı Nedir?

Veri tabanı, düzenli biçimde depolanan ve kolayca erişilebilen, yönetilebilen yapılandırılmış veri koleksiyonudur. Ham verinin aksine, veri tabanındaki bilgiler bir schema (şema) ya da model çerçevesinde organize edilir; bu sayede sorgulama, filtreleme ve güncelleme işlemleri sistematik şekilde yapılabilir.

Temel ayrım: Veri tabanı (database) sadece verilerin depolandığı yapıdır. DBMS ise bu yapıyı yöneten, sorgular çalıştıran ve güvenliği sağlayan yazılım katmanıdır.

DBMS / VTYS — Veri Tabanı Yönetim Sistemi

DBMS (Database Management System — Veri Tabanı Yönetim Sistemi), kullanıcı ile fiziksel veri arasına giren ara yazılımdır. Temel görevleri şunlardır:

DBMS'in Sağladıkları

  • Veri bütünlüğü: Tutarsız ya da hatalı veri girişini önler.
  • Eşzamanlılık: Çok kullanıcılı ortamlarda aynı anda okuma/yazma işlemlerini yönetir.
  • Güvenlik: Rol tabanlı erişim denetimi (RBAC) sağlar.
  • Yedekleme & Kurtarma: Veri kaybını minimize eden transaction log sistemleri içerir.
  • Soyutlama: Fiziksel disk yapısını uygulamadan gizler.

Dikkat Edilmesi Gerekenler

  • Ek bellek ve işlemci kaynağı tüketir.
  • Yanlış konfigürasyon performansı ciddi ölçüde düşürebilir.
  • Lisanslı DBMS'ler (Oracle, MS SQL) yüksek maliyetli olabilir.
  • Büyük şemalar bakımı zorlaştırır.

Yaygın DBMS örnekleri: PostgreSQL, MySQL, Oracle DB, MS SQL Server (ilişkisel); MongoDB, Cassandra (doküman/kolon tabanlı); Redis (anahtar-değer); Neo4j (grafik).

2

Veri Tabanı Türleri

RDBMS

İlişkisel

Tablolar, satırlar, sütunlar. SQL dili. ACID garantisi.

Document

Doküman

JSON/BSON belgeler. Esnek şema. Yatay ölçeklenme.

Key-Value

Anahtar-Değer

Basit hash yapısı. Ultra hızlı. Cache senaryoları.

Graph

Grafik

Düğümler ve kenarlar. İlişki sorguları için ideal.

🗄

İlişkisel Veri Tabanları (RDBMS)

PostgreSQL · MySQL · Microsoft SQL Server · Oracle DB · SQLite

İlişkisel modelde veriler tablolarda saklanır. Her tablo satır (row/tuple) ve sütunlardan (column/attribute) oluşur. Tablolar arasındaki ilişkiler foreign key (yabancı anahtar) ile kurulur. Tüm işlemler ACID (Atomicity, Consistency, Isolation, Durability) özelliklerine tabidir.

Ne zaman tercih edilmeli? Veriler arası güçlü ilişki varsa, veri bütünlüğü kritikse (finans, muhasebe, e-ticaret siparişleri), karmaşık JOIN sorguları gerekiyorsa ve ekip SQL biliyor ise RDBMS doğru seçimdir.

FinansE-ticaretERP/CRM MuhasebeSağlık Kayıtları

Avantajlar

  • ACID garantisi — veri tutarlılığı yüksek
  • Güçlü sorgulama dili (SQL)
  • Olgun ekosistem ve geniş araç desteği
  • JOIN ile çok tablolu sorgular mümkün
  • Normalizasyon ile veri tekrarı önlenir

Dezavantajlar

  • Dikey ölçekleme (scale-up) maliyetli
  • Şema değişikliği migrasyonu gerektirir
  • Çok büyük hacimde düzensiz veri için yetersiz kalabilir
  • Object-Relational impedance (ORM karmaşıklığı)
📄

Doküman Tabanlı NoSQL

MongoDB · CouchDB · Firestore · Amazon DocumentDB

Veriler JSON benzeri dokümanlar (MongoDB'de BSON) olarak saklanır. Her doküman, kendi şemasını barındırabilir; yani aynı koleksiyondaki iki dokümanın alanları tamamen farklı olabilir. Bu esneklik, hızlı gelişim döngüleri için büyük avantaj sağlar.

Ne zaman tercih edilmeli? Veri yapısı sık değişiyorsa, JSON API'ler ile çalışılıyorsa, yatay ölçekleme (sharding) ihtiyacı varsa veya hiyerarşik iç içe veri saklanıyorsa (ürün katalogları, kullanıcı profilleri) MongoDB idealdir.

İçerik YönetimiÜrün Kataloğu Kullanıcı ProfilleriLoglama

Avantajlar

  • Schema-free — şema esnekliği yüksek
  • Yatay ölçekleme (sharding) desteği
  • JSON ile doğal entegrasyon
  • Zengin sorgulama operatörleri ($match, $group, vb.)

Dezavantajlar

  • JOIN yerine uygulama katmanında ilişki yönetimi
  • ACID tam desteği sınırlı (v4+ kısmi destek var)
  • Veri tekrarı (denormalization) disk kullanımını artırır

Anahtar-Değer (Key-Value) NoSQL

Redis · Memcached · DynamoDB · Riak

En basit veri modeli: her şey bir anahtar (key) ile eşleşen bir değerden (value) oluşur. Redis, bu modeli zengin veri yapılarıyla (String, Hash, List, Set, Sorted Set, Stream) güçlendirmiş; in-memory mimarisi sayesinde mikrosaniye mertebesinde yanıt süreleri sunar.

Ne zaman tercih edilmeli? Oturum yönetimi (session), önbellekleme (caching), gerçek zamanlı sıralamalar (leaderboard), pub/sub mesajlaşma ve rate limiting gibi hız gerektiren senaryolarda Redis birincil tercihtir.

Cache LayerSession Store Rate LimitingPub/SubLeaderboard

Avantajlar

  • Mikrosaniye yanıt süresi (in-memory)
  • Çok sayıda veri yapısı desteği
  • TTL (Time-To-Live) ile otomatik süre sonu
  • Persistence seçenekleri (RDB, AOF)

Dezavantajlar

  • Veri boyutu RAM ile sınırlı
  • Karmaşık sorgulama imkânı yok
  • İlişkisel veri modeli için uygun değil
🕸

Grafik (Graph) Tabanlı NoSQL

Neo4j · Amazon Neptune · ArangoDB · TigerGraph

Veriler düğüm (node) ve kenar (edge/relationship) olarak modellenir. Kenarlar da özellikler (properties) taşıyabilir. Grafik veri tabanları, özellikle derinlemesine gezinme (traversal) sorgularında ilişkisel veri tabanlarını çok geride bırakır; çünkü JOIN yerine doğrudan işaretçi (pointer) takibi kullanır.

Ne zaman tercih edilmeli? Sosyal ağlar, öneri motorları (recommendation engine), dolandırıcılık tespiti, erişim kontrol grafikleri ve bilgi grafikleri (knowledge graph) gibi ilişkilerin kendisinin birinci sınıf veri olduğu senaryolarda Neo4j rakipsizdir.

Sosyal AğÖneri Motoru Fraud DetectionKnowledge Graph

Avantajlar

  • Derin ilişki sorguları son derece hızlı
  • Cypher sorgu dili okunabilir ve güçlü
  • Veri modeli gerçek dünyayı doğal yansıtır
  • Grafik algoritmaları (PageRank, BFS) yerleşik

Dezavantajlar

  • Tablosal raporlama sorgularında yavaş kalır
  • Yatay ölçekleme RDBMS kadar olgun değil
  • Ekosistem, SQL dünyasına kıyasla daha küçük
3

Komutlar ve Kısaltma Sözlüğü

Veri tabanı dünyasında karşılaşacağın tüm temel kısaltmalar ve açılımları aşağıda listelenmiştir.

Temel Terminoloji

SQL
Structured Query Language
Yapılandırılmış Sorgu Dili. İlişkisel veri tabanlarında veri tanımlama, düzenleme ve sorgulama için kullanılan standart dil.
NoSQL
Not Only SQL
Yalnızca SQL değil. Tablo-dışı veri modellerini (doküman, grafik, key-value, kolon) kapsayan veri tabanı kategorisi.
DBMS
Database Management System
Veri Tabanı Yönetim Sistemi. Veriyi yöneten, sorgulayan ve koruyan yazılım katmanı.
RDBMS
Relational DBMS
İlişkisel VTYS. Tablo tabanlı, SQL kullanan, ACID uyumlu veri tabanı yönetim sistemi.
DDL
Data Definition Language
Veri Tanımlama Dili. Tablo ve şema oluşturmak için kullanılan SQL komutları: CREATE, ALTER, DROP, TRUNCATE.
DML
Data Manipulation Language
Veri İşleme Dili. Tablo içindeki veriye erişmek ve değiştirmek için: SELECT, INSERT, UPDATE, DELETE.
DCL
Data Control Language
Veri Kontrol Dili. Yetkilendirme ve güvenlik komutları: GRANT, REVOKE.
TCL
Transaction Control Language
İşlem Kontrol Dili. Transaction (işlem grubu) yönetimi: COMMIT, ROLLBACK, SAVEPOINT, BEGIN.
ACID
Atomicity · Consistency · Isolation · Durability
Atomiklik · Tutarlılık · Yalıtım · Dayanıklılık. İlişkisel veri tabanlarının transaction güvenliğini tanımlayan dört temel özellik.
BASE
Basically Available · Soft-state · Eventually consistent
NoSQL sistemlerin benimsediği, ACID'e alternatif tutarlılık modeli. Nihai tutarlılığı kabul eder, yüksek kullanılabilirliği önceliklendirir.
PK
Primary Key
Birincil Anahtar. Tablodaki her satırı tekil olarak tanımlayan sütun ya da sütun grubu.
FK
Foreign Key
Yabancı Anahtar. Bir tablodaki sütunun başka bir tablonun birincil anahtarına referans verdiği ilişki mekanizması.
ORM
Object-Relational Mapping
Nesne-İlişkisel Eşleştirme. Uygulama nesnelerini (class) otomatik olarak veri tabanı tablolarına dönüştüren araç katmanı. Örn: Hibernate, SQLAlchemy, Prisma.
ORM
Örnek: Sequelize, Prisma, Hibernate
Kod tarafında SQL yazmadan veri tabanı işlemi yapmayı sağlar. Güç: üretkenlik. Zayıf: performans kontrolü azalır.
ERD
Entity Relationship Diagram
Varlık-İlişki Diyagramı. Tabloları, sütunları ve aralarındaki ilişkileri görsel olarak modelleyen diyagram türü.
TTL
Time To Live
Yaşam Süresi. Cache ve NoSQL sistemlerinde bir anahtarın ne kadar süre sonra otomatik olarak silineceğini belirten parametre (saniye cinsinden).
BSON
Binary JSON
MongoDB'nin verileri saklamak için kullandığı, JSON'un ikili (binary) ve daha verimli kodlanmış hali.
REPL
Read-Eval-Print Loop
Mongo Shell, Redis CLI gibi etkileşimli veri tabanı istemcileri için kullanılan interaktif komut satırı ortamı.

CRUD Operasyonları

Her veri tabanının temel işlem seti olan CRUD'un farklı sistemlerdeki karşılıkları:

CRUD Referans Tablosu
CRUDSQL (RDBMS)MongoDBRedisAçıklama
CreateINSERTinsertOne / insertManySETYeni kayıt ekleme
ReadSELECTfind / findOneGETVeri okuma / sorgulama
UpdateUPDATEupdateOne / updateManySET (üzerine yaz)Mevcut veriyi güncelleme
DeleteDELETEdeleteOne / deleteManyDELVeri silme
4

Pratik Kullanım Komutları

🗄 SQL — PostgreSQL / MySQL

Veri Tabanı ve Tablo Oluşturma (DDL)

SQL · DDL
-- Yeni bir veri tabanı oluştur
CREATE DATABASE uygulama_db;

-- Veri tabanını seç (MySQL)
USE uygulama_db;

-- PostgreSQL için bağlanma komutu (terminal)
-- \c uygulama_db

-- Kullanıcılar tablosu oluştur
CREATE TABLE kullanicilar (
    id           SERIAL PRIMARY KEY,       -- Otomatik artan birincil anahtar
    ad           VARCHAR(100) NOT NULL,   -- Zorunlu metin alanı
    email        VARCHAR(255) UNIQUE NOT NULL, -- Tekil ve zorunlu
    olusturulma  TIMESTAMP DEFAULT NOW()  -- Varsayılan: şu an
);

-- Mevcut tabloya yeni sütun ekle (ALTER)
ALTER TABLE kullanicilar
    ADD COLUMN telefon VARCHAR(20);

-- Tabloyu tamamen sil (veri + yapı)
DROP TABLE IF EXISTS kullanicilar;

Veri Ekleme (DML — INSERT)

SQL · INSERT
-- Tek kayıt ekle
INSERT INTO kullanicilar (ad, email)
VALUES ('Ahmet Yılmaz', 'ahmet@example.com');

-- Birden fazla kayıt ekle
INSERT INTO kullanicilar (ad, email) VALUES
    ('Fatma Şahin', 'fatma@example.com'),
    ('Mehmet Çelik', 'mehmet@example.com'),
    ('Zeynep Öztürk', 'zeynep@example.com');

Veri Sorgulama (DML — SELECT)

SQL · SELECT
-- Tüm sütunları getir
SELECT * FROM kullanicilar;

-- Belirli sütunlar ve filtreleme
SELECT ad, email
FROM   kullanicilar
WHERE  email LIKE '%@example.com'
ORDER BY ad ASC
LIMIT 10;

-- Aggregate: kaç kullanıcı var?
SELECT COUNT(*) AS toplam_kullanici
FROM   kullanicilar;

-- İki tabloyu JOIN ile birleştir
SELECT k.ad, s.baslik
FROM   kullanicilar  AS k
JOIN   siparisler    AS s  ON s.kullanici_id = k.id
WHERE  k.id = 1;

Güncelleme ve Silme (DML — UPDATE / DELETE)

SQL · UPDATE · DELETE
-- Belirli bir kaydı güncelle (WHERE olmadan BÜTÜN kayıtlar güncellenir!)
UPDATE kullanicilar
SET    telefon = '+90 532 000 00 00'
WHERE  id = 1;

-- Belirli bir kaydı sil
DELETE FROM kullanicilar
WHERE id = 5;

-- Transaction ile güvenli işlem
BEGIN;
    UPDATE hesaplar SET bakiye = bakiye - 100 WHERE id = 1;
    UPDATE hesaplar SET bakiye = bakiye + 100 WHERE id = 2;
COMMIT; -- Hata varsa: ROLLBACK;

📄 MongoDB

Veri Tabanı ve Koleksiyon Oluşturma

MongoDB Shell
// Veri tabanına geç (yoksa ilk belge eklenince oluşur)
use uygulama_db

// Koleksiyon oluştur (explicit)
db.createCollection("kullanicilar")

// Tek doküman ekle — schema-free, her alan isteğe bağlı
db.kullanicilar.insertOne({
    ad:    "Ahmet Yılmaz",
    email: "ahmet@example.com",
    roller: ["admin", "editor"],   // dizi
    adres: {                           // iç içe belge
        sehir: "İstanbul",
        posta: "34000"
    },
    olusturulma: new Date()
})

// Birden fazla doküman ekle
db.kullanicilar.insertMany([
    { ad: "Fatma Şahin", email: "fatma@example.com" },
    { ad: "Mehmet Çelik", email: "mehmet@example.com" }
])

Sorgulama (find)

MongoDB · Queries
// Tüm belgeleri getir
db.kullanicilar.find({})

// Filtreli sorgu — şehri İstanbul olanlar
db.kullanicilar.find({ "adres.sehir": "İstanbul" })

// Sadece ad ve email alanlarını getir (projection)
db.kullanicilar.find(
    { roller: "admin" },      // filtre
    { ad: 1, email: 1, _id: 0 }  // projeksiyon
)

// Sıralama, limit ve atla
db.kullanicilar.find({})
    .sort({ ad: 1 })   // 1: artan, -1: azalan
    .skip(10)
    .limit(5)

// Aggregation pipeline örneği — şehre göre grupla
db.kullanicilar.aggregate([
    { $group: { _id: "$adres.sehir", sayi: { $sum: 1 } } },
    { $sort: { sayi: -1 } }
])

Güncelleme ve Silme

MongoDB · Update · Delete
// Tek belge güncelle — $set sadece belirtilen alanı değiştirir
db.kullanicilar.updateOne(
    { email: "ahmet@example.com" },
    { $set: { "adres.sehir": "Ankara" } }
)

// Tüm eşleşen belgeleri güncelle
db.kullanicilar.updateMany(
    { "adres.sehir": "İstanbul" },
    { $set: { bolge: "Marmara" } }
)

// Tek belge sil
db.kullanicilar.deleteOne({ email: "silinecek@example.com" })

// Tüm eşleşen belgeleri sil
db.kullanicilar.deleteMany({ aktif: false })

⚡ Redis

Temel String Komutları

Redis CLI
# String: SET / GET
SET  kullanici:1:ad  "Ahmet Yılmaz"
GET  kullanici:1:ad
# → "Ahmet Yılmaz"

# TTL ile süre sonu belirle (60 saniye)
SET   oturum:abc123  "kullanici_id_42"  EX  3600
TTL   oturum:abc123        # Kalan saniye
PERSIST oturum:abc123     # TTL'yi kaldır
DEL   oturum:abc123        # Anahtarı sil

# Sayaç artırma / azaltma
SET  sayfa:anasayfa:goruntulemeler  0
INCR sayfa:anasayfa:goruntulemeler   # → 1
INCRBY sayfa:anasayfa:goruntulemeler 10  # → 11
DECR sayfa:anasayfa:goruntulemeler   # → 10

Hash, List ve Sorted Set

Redis · Veri Yapıları
# HASH — nesne gibi çalışır
HSET   kullanici:1  ad "Ahmet"  email "ahmet@example.com"  yas 28
HGET   kullanici:1  ad
HGETALL kullanici:1          # tüm alanlar
HDEL   kullanici:1  yas     # alan sil

# LIST — sıralı liste (kuyruk / stack)
LPUSH  gorevler  "email-gonder" "rapor-olustur"  # başa ekle
RPUSH  gorevler  "veri-temizle"                   # sona ekle
LPOP   gorevler                  # soldan çıkar
LRANGE gorevler  0  -1          # tüm listeyi getir

# SORTED SET — skor ile sıralı küme (leaderboard)
ZADD   liderlik  4250  "ahmet"
ZADD   liderlik  7800  "fatma"
ZADD   liderlik  5500  "mehmet"
ZREVRANGE liderlik  0  2  WITHSCORES  # En yüksek 3
# → fatma 7800, mehmet 5500, ahmet 4250

🕸 Neo4j — Cypher Sorgu Dili

Cypher (CQL): Neo4j'nin kendi sorgu dili. İngilizce açılımı Cypher Query Language'dir. Grafik yapılarını ASCII sanatıyla ifade eder: (node)-[:EDGE]->(node)

Düğüm ve İlişki Oluşturma

Cypher · Neo4j
// Düğüm oluştur — CREATE
CREATE (a:Kisi { ad: 'Ahmet Yılmaz', yas: 28, sehir: 'İstanbul' })
CREATE (f:Kisi { ad: 'Fatma Şahin', yas: 32, sehir: 'Ankara' })

// İlişki oluştur — Ahmet, Fatma'yı TANIYORdur
MATCH  (a:Kisi { ad: 'Ahmet Yılmaz' }),
       (f:Kisi { ad: 'Fatma Şahin' })
CREATE (a)-[:TANIYOR { yil: 2018 }]->(f)

// Varsa getir, yoksa oluştur — MERGE
MERGE (k:Kisi { email: 'yeni@example.com' })
ON CREATE SET k.olusturulma = datetime()
ON MATCH SET  k.guncellendi = datetime()

Grafik Sorgulama (MATCH)

Cypher · Queries
// Tüm Kisi düğümlerini getir
MATCH (k:Kisi) RETURN k

// Ahmet'in tanıdıklarını bul
MATCH (a:Kisi { ad: 'Ahmet Yılmaz' })-[:TANIYOR]->(t)
RETURN t.ad, t.sehir

// Derinlik-2: arkadaşın arkadaşı (2 adım)
MATCH (a:Kisi { ad: 'Ahmet Yılmaz' })-[:TANIYOR*2]->(uzak)
RETURN DISTINCT uzak.ad

// Kısa yolu bul — Dijkstra benzeri
MATCH shortestPath(
    (a:Kisi { ad: 'Ahmet Yılmaz' })
    -[:TANIYOR*]-
    (f:Kisi { ad: 'Fatma Şahin' })
)
RETURN path

// Güncelle — SET ile
MATCH (k:Kisi { ad: 'Ahmet Yılmaz' })
SET k.sehir = 'İzmir'
RETURN k

// Düğüm ve tüm ilişkilerini sil
MATCH (k:Kisi { ad: 'Ahmet Yılmaz' })
DETACH DELETE k   // DETACH: önce ilişkileri kopar

İpucu: Neo4j'de DETACH DELETE kullanmak zorunludur; aksi hâlde düğümün ilişkileri varken silme işlemi hata verir. Bu, kazara silmeye karşı bilinçli bir tasarım kararıdır.