Skip to content

Temel Veritabanı Kavramları ​

Veritabanı seçimi yalnızca SQL mi NoSQL mi sorusu değildir; veri modeli, sorgu şekli, tutarlılık beklentisi, operasyon yükü ve maliyet birlikte değerlendirilir. En iyi veritabanı, sistemin en kritik erişim desenini en sade şekilde taşıyandır.

Hızlı Karar ​

İhtiyaçBaşlangıç SeçimiDikkat
Güçlü transaction ve ilişkisel modelPostgreSQL / MySQLŞema evrimi ve indeks bakımı
Esnek doküman yapısıMongoDB benzeri doküman DBQuery disiplinini kaybetme riski
Düşük gecikmeli geçici veriRedisBellek maliyeti ve persistence beklentisi
Büyük hacimli aramaElasticsearch/OpenSearchKaynak tüketimi ve eventual consistency

Üretim Kontrol Listesi ​

  • Problem: Veri hangi sorgular için optimize ediliyor, hangi sorgular bilinçli olarak pahalı kalacak?
  • Çözüm: Primary key, index, transaction sınırı, migration ve backup stratejisi net mi?
  • Trade-off: Normalizasyon tutarlılığı artırır; denormalizasyon okuma hızını artırır ama senkronizasyon borcu ekler.
  • Hata durumu: Lock wait, slow query, connection pool exhaustion, replication lag ve migration rollback planı olmalı.
  • Ölçüm: Query latency, index hit ratio, connection pool kullanımı, disk I/O, replication lag ve storage büyümesi izlenmeli.
  • Güvenlik/maliyet: PII alanları, encryption, erişim rolleri ve retention politikası baştan tasarlanmalı; indeks ve replika sayısı maliyeti büyütür.

Veritabanı Mimarisi Diyagramı ​

Temel Veritabanı Konseptleri ​

SQL Veritabanları (Spring Boot ile) ​

Spring Data JPA ​

  • Hibernate ORM üzerinden entity eşleme
  • @Entity/@Table anotasyonları ile şema eşleme

Repository Deseni ​

  • JpaRepository<Entity, ID> ile CRUD işlemleri
  • Özel sorgu metotları (@Query anotasyonu)

Transaction Yönetimi ​

  • @Transactional anotasyonu ile deklaratif transaction yönetimi
  • İzolasyon seviyeleri
  • Yayılım davranışları

Bağlantı Havuzu (Connection Pooling) ​

  • HikariCP ile üretime hazır bağlantı havuzu
  • Bağlantı sızıntısı tespiti

Veritabanı Göçleri (Migration) ​

  • Flyway/Liquibase ile şema versiyonlama
  • Başlangıç göçleri
  • Tekrarlanabilir scriptler

PostgreSQL ​

  • JSON/JSONB desteği
  • Gelişmiş indeksleme
  • Tam metin arama
  • Yatay ölçekleme ile CitusDB

MySQL ​

  • Master-slave replikasyonu
  • InnoDB depolama motoru
  • Bölümlendirme stratejileri

NoSQL Veritabanları (Spring Boot ile) ​

MongoDB ​

  • Spring Data MongoDB ile doküman tabanlı depolama
  • @Document anotasyonu
  • Tepkisel (reactive) destek

Redis ​

  • Spring Data Redis ile önbellekleme katmanı
  • RedisTemplate/StringRedisTemplate
  • Yayın/abone mesajlaşma

Elasticsearch ​

  • Spring Data Elasticsearch ile tam metin arama
  • Toplu sorgular (aggregations)
  • Gerçek zamanlı analizler

Cassandra ​

  • Spring Data Cassandra ile geniş sütunlu veri deposu
  • Sonunda tutarlılık (eventual consistency)
  • Yüksek erişilebilirlik

Veritabanı Tasarım Desenleri ​

Alan Odaklı Tasarım (Domain-Driven Design) ​

Olay Kaynaklı Mimari (Event Sourcing) ​

CQRS ​

Servis Başına Veritabanı ​

  • Mikroservis deseni
  • Veri sahipliği
  • Dağıtık transaction zorlukları

İndeksleme (Indexleme) - Spring Boot Perspektifi ​

JPA İndeks Anotasyonları ​

  • @Index anotasyonu ile entity seviyesinde indeks tanımları
  • @Table(indexes = {...}) ile bileşik indeksler

Veritabanına Özgü İndeksler ​

  • PostgreSQL JSONB indeksleri
  • MySQL tam metin indeksleri
  • Coğrafi veriler için uzamsal indeksler

Performans İzleme ​

  • Spring Boot Actuator ile yavaş sorgu tespiti
  • Hibernate istatistikleri
  • Bağlantı havuzu metrikleri

İndeks Stratejisi ​

  • Kardinalite analizi
  • Kapsayıcı indeksler ile sorgu performansı
  • Kısmi indeksler ile depolama optimizasyonu

B-tree Uygulaması ​

Normalizasyon ve Denormalizasyon - Spring Boot Bağlamı ​

Normalizasyon (3NF/BCNF) ​

  • JPA @OneToMany/@ManyToOne ilişkileri ile yabancı anahtar kısıtları
  • @JoinColumn ile ilişki eşleme

Denormalizasyon Stratejileri ​

  • @Formula anotasyonu ile hesaplanmış alanlar
  • @SecondaryTable ile tablo bölme
  • Okuma için optimize görünümler

Olay Tabanlı Denormalizasyon ​

  • Alan olayları ile türetilmiş veri senkronizasyonu
  • Sonunda tutarlılık desenleri

Materyalize Görünümler ​

  • Veritabanı seviyesinde önceden hesaplanmış toplulaştırmalar
  • Spring zamanlanmış görevler ile görünüm güncelleme

Tercihler ​

  • Yazma karmaşıklığı vs okuma performansı
  • Depolama maliyeti vs sorgu hızı
  • Tutarlılık vs erişilebilirlik

Performans Optimizasyonu ​

İndeksleme Stratejileri ​

  • B-tree indeksleri: Varsayılan indeks türü, eşitlik ve aralık sorguları için iyi
  • Kısmi indeksler: Sadece belirli satırları indeksler, indeks boyutunu azaltır
  • Bileşik indeksler: Birden fazla sütun, sıralama önemli
  • Kapsayıcı indeksler: Tüm gerekli sütunları içerir, tabloya erişimi önler

Sorgu Optimizasyonu ​

  • EXPLAIN PLAN analizi
  • N+1 sorgu problemi (@EntityGraph, @BatchSize)

Önbellekleme Katmanları ​

  • İkinci seviye önbellek (Hibernate)
  • Sorgu sonucu önbelleği
  • Dağıtık önbellek (Redis)

Okuma Kopyaları (Read Replicas) ​

  • Master-slave replikasyonu
  • Okuma-yazma ayrımı
  • Sonunda tutarlılık yönetimi

Dağıtık Veritabanı Desenleri ​

Parçalama Stratejileri (Sharding) ​

Replikasyon ​

CAP Teoremi ​

Veritabanı Federasyonu ​

  • Veritabanları arası sorgular
  • Veri sanallaştırma
  • Servis odaklı veri erişimi

Çoklu Veritabanı Kullanımı (Polyglot Persistence) ​

  • Doğru iş için doğru araç
  • Hibrit depolama stratejileri
  • Veri senkronizasyonu zorlukları

SQL ve NoSQL Karşılaştırması ​

ÖzellikSQLNoSQL
ŞemaSabitEsnek
ACID✅Değişken
ÖlçeklenebilirlikDikeyYatay
Karmaşık Sorgular✅Sınırlı
TutarlılıkGüçlüSonunda
OlgunlukYüksekDeğişken

Veritabanı Seçim Kriterleri ​

SQL Veritabanı Kullan ​

  • Karmaşık ilişkiler
  • ACID uyumluluğu gerekli
  • Karmaşık sorgular ve analizler
  • Güçlü tutarlılık ihtiyacı
  • Olgun ekosistem gereksinimi

NoSQL Veritabanı Kullan ​

  • Yatay ölçeklenebilirlik ihtiyacı
  • Esnek şema gereksinimi
  • Yüksek erişilebilirlik önceliği
  • Basit sorgu desenleri
  • Hızlı geliştirme döngüleri

İzleme ve Performans ​

Veritabanı Metrikleri ​

  • Sorgu yürütme süresi
  • Bağlantı havuzu kullanımı
  • İndeks kullanımı
  • Kilitlenme (lock contention)
  • Replikasyon gecikmesi

Optimizasyon Teknikleri ​

  • Sorgu performans ayarı
  • İndeks optimizasyonu
  • Bağlantı havuzu ayarı
  • Bölümlendirme stratejileri
  • Önbellekleme uygulamaları

Veri Modeli ve Store Seçimi ​

SQL/NoSQL kararı tek başına yeterli değildir. Önce access pattern, cardinality, write/read oranı, ordering, retention ve consistency ihtiyacı yazılır.

Store türüGüçlü olduğu alanTipik risk
Relationalİlişkiler, transaction, constraint, joinYatay büyüme ve write contention
DocumentAggregate odaklı esnek şemaCross-document transaction ve join sınırlılığı
Key-value/cacheÇok hızlı key lookup, session, hot dataQuery esnekliği ve eviction
GraphNode-edge ilişkileri ve traversalGenel raporlama ve operasyon maliyeti
Time-seriesZaman sıralı ölçüm, retention ve downsamplingGenel transaction/query esnekliği

Document modelde birlikte okunan aggregate aynı document'ta tutulabilir; sık güncellenen veya bağımsız sahipliği olan veriler ayrılabilir. Graph model ilişkilerin kendisi sorgunun merkezindeyse değerlidir. Time-series modelde event time, high-cardinality label ve retention tasarımın parçasıdır.

Data Modeling Yaklaşımı ​

  1. Önce sorguları ve yazma akışlarını listele.
  2. Aggregate sınırlarını ve veri sahipliğini belirle.
  3. Primary key, partition key ve index'leri access pattern'e göre seç.
  4. Normalization ile update doğruluğunu, denormalization ile okuma maliyetini karşılaştır.
  5. Retention, archive, backup ve migration planını baştan yaz.

SQL query language; join, transaction ve ad-hoc analizde güçlüdür. Document/key-value query'leri çoğu zaman belirli key ve index erişimlerine optimize edilir. Graph query ilişkisel traversal'ı, time-series query ise window, aggregation ve downsampling'i öne çıkarır. Query language kolaylığı, kötü access pattern'i düzeltmez.

Storage Selection Kararı ​

SoruSonuca etkisi
En kritik sorgu nedir?Index, partition ve model
Transaction sınırı nerede?Relational veya local transaction
Veri ne hızla büyüyor?Partition, retention ve tiering
Stale read kabul edilir mi?Replica/cache kullanımı
İlişki traversal mı, aggregate mı?Graph veya document seçimi
Ölçümler zaman serisi mi?Time-series retention ve rollup

Polyglot persistence ancak her store için owner, backup, migration, monitoring ve source of truth açık olduğunda değerlidir.

Data Access Katmanı ve Paylaşılan Veritabanı ​

Repository domain'e anlamlı koleksiyon işlemleri sunar; DAO daha düşük seviyede persistence ayrıntısını saklar; unit of work aynı business operation içindeki değişiklikleri transaction sınırında toplar. Spring Data repository kolaylık sağlar, ancak query planı, transaction boundary ve N+1 davranışı yine gözlemlenmelidir.

Java/Spring Boot odağında JPA/Hibernate, JDBC veya jOOQ seçimi; aggregate şekli, sorgu kontrolü, ekip uzmanlığı ve performans gereksinimiyle yapılır. ORM lazy/eager kararları, batch size, optimistic lock ve migration sürümü API davranışından bağımsız değildir.

Database per service veri sahipliğini ve bağımsız deploy'u destekler; shared database ise legacy geçişi kolaylaştırırken şema coupling'i, lock yarışları, ortak migration ve yetki sınırı sorunları üretir. Shared database geçici ise owner, erişim allowlist'i, deprecation tarihi ve ayrıştırma adımları yazılmalıdır.

Event-Driven Data Sync ve CDC ​

Read model veya arama index'i başka bir store'a taşınırken event/outbox ya da log-based CDC kullanılabilir. CDC akışında ordering key, offset, schema evolution, replay, duplicate, delete/tombstone ve backfill politikaları tanımlanır. Projection gecikmesi ölçülmeli; source of truth ile projection aynı şeymiş gibi sunulmamalıdır.

Database transaction'ı ile event publish atomik değilse dual-write riski oluşur. Outbox, transaction içinde event kaydı tutup ayrı publisher ile yayınlayarak bu aralığı daraltır; consumer yine idempotent olmalıdır.

Eren Demir tarafından oluşturulmuştur.