Veritabani Tasarim Desenleri: Iliskisel ve NoSQL Dunyasinda
Normalizasyon, indeksleme stratejileri, yatay bolumleme (sharding), replikasyon, okuma modelleri ve mikroservislerde veri yonetimi icin kapsamli bir rehber.
Veritabani tasarimi, cogu gelistiricinin kariyerinde bir kez ogrenip uzun sure kullandigi bir bilgi alanidir. Ancak veri hacimleri buyudukce ve mimariler karmasiklastikca, ilk ogrendiginiz temel prensipler genellikle yetersiz kalir. Bu yazi, hem iliskisel hem de NoSQL veritabanlari icin farkli olcekte calisan tasarim desenlerini ele aliyor.
Iliskisel veritabanlari, veri butunlugu ve tutarliligi konusunda esnek olmayan ancak guclu garantiler sunar. NoSQL veritabanlari ise olceklenebilirlik ve esneklik icin bu garantilerden odun verir. Dogru tercih, uygulamanizin gereksinimlerine ve calisma yukunuze baglidir.
Normalizasyon ve denormalizasyon
Normalizasyon, veri tekrarini azaltmak ve veri butunlugunu saglamak icin tablolari ayirma surecidir. 3NF (Ucuncu Normal Form), cogu uygulama icin yeterli bir normalizasyon seviyesidir. Ancak normalizasyon, okuma performansini olumsuz etkileyebilir: birlestirme (JOIN) islemleri, ozellikle buyuk tablolarda maliyetlidir.
Denormalizasyon, okuma performansini artirmak icin veri tekrarini kabul etmektir. Bir siparis tablosunda, musteri adini dogrudan saklamak normalizasyon kurallarina aykiridir ancak her okumada musteri tablosuna JOIN yapma ihtiyacini ortadan kaldirir.
Denormalizasyonu ne zaman kullanacaginizi bilmek onemlidir. Genel kural: once normal formda tasarlayin, sonra okuma performansini olcun ve gerekiyorsa denormalize edin. Tahminle degil, veriyle karar verin.
Indeksleme stratejileri
Indeksler, veritabani performansinin en kritik bilesenidir. Dogru indeks, bir sorguyu saniyelerden milisaniyelere dusurebilir. Ancak indekslerin de bir maliyeti vardir: her INSERT, UPDATE ve DELETE islemi, ilgili indeksleri de gunceller.
- B-tree indeks: Cogu sorgu icin varsayilan indeks turu. Esitlik, aralik ve siralama sorgularinda etkilidir.
- Hash indeks: Yalnizca esitlik sorgularinda (WHERE id = 123) kullanilir. Aralik sorgularinda calismaz.
- GIN indeks: Dizi ve JSONB sutunlarinda arama yapmak icin kullanilir. PostgreSQL in JSONB sorgulari icin idealdir.
- GiST indeks: Tam metin aramasi ve cografi sorgular icin kullanilir.
- Bilesik indeks: Birden fazla sutunu kapsayan indeks. Sutun sirasi onemlidir: en secici sutun once gelmelidir.
Indeks seciminde en sik yapilan hata, her sutuna indeks eklemektir. Bu, yazma performansini dusurur ve disk kullanimini artirir. Bunun yerine, yavas sorgulari tespit edin (slow query log) ve yalnizca bu sorgulari hizlandirmak icin indeks ekleyin.
Indeks bakimi da onemlidir. Zamanla, ozellikle cok fazla guncelleme yapilan tablolarda indeksler sislebilir. VACUUM ve REINDEX gibi bakim islemleri, indekslerin performansini korur.
Yatay bolumleme (Sharding)
Yatay bolumleme, veriyi birden fazla sunucuya dagitma islemidir. Her sunucu (shard), verinin bir kismini icerir. Yatay bolumleme, bir veritabani sunucusunun kapasitesini astiginizda basvurmaniz gereken bir stratejidir.
Yatay bolumlemenin en kritik karari, bolumleme anahtarinin (shard key) secimidir. Iyi bir bolumleme anahtari, veriyi esit dagitmali ve sorgularin cogunun yalnizca bir shard a gitmesini saglamalıdır. Kullanici ID si, cogu uygulama icin iyi bir shard anahtari adayidir cunku her kullanicinin verisi genellikle ayni shard da kalir.
Yatay bolumleme, uygulama katmaninda ek karmasiklik gerektirir. Dagitilmis islemler (distributed transactions), shard lar arasi sorgular ve veri yeniden dagitimi (resharding), cozulmesi gereken sorunlardir. Bu nedenle yatay bolumlemeye gecmeden once, onceki tum optimizasyonlari (indeksleme, sorgu iyilestirme, replikasyon) denemek onemlidir.
Replikasyon
Replikasyon, verinin bir veya daha fazla kopyasini tutma islemidir. Ana-okuyucu (primary-replica) replikasyonu, en yaygin modeldir. Ana sunucu tum yazma islemlerini alir ve okuyucu sunucular yalnizca okuma islemleri icin kullanilir.
Replikasyonun faydalari: okuma performansini artirir (okuma yuku birden fazla sunucuya dagitilir), yuksek kullanilabilirlik saglar (ana sunucu basarisiz olursa, bir okuyucu ana haline getirilebilir) ve cografik olarak yedekleme imkani sunar.
Replikasyon gecikmesi (replication lag), replikasyonun en sik karsilasilan sorunudur. Bir kullanicinin yazdigi veriyi, okuma islemi hemen goremiyorsa, bu bir tutarlilik sorunudur. Cozum olarak, kullanici kendi yazdigi veriyi her zaman ana sunucudan okuyabilir (read-your-writes tutarliligi).
Mikroservislerde veri yonetimi
Mikroservis mimarilerinde veri yonetimi, monolitik uygulamalardan farklidir. Her servis kendi veritabanina sahiptir (Database per Service deseni). Bu, servisler arasi gevsek baglanti saglar ancak veri butunlugu ve tutarlilik konusunda zorluklar yaratir.
Servisler arasi veri paylasimi icin genellikle API cagrilari veya olay tabanli (event-driven) iletisim kullanilir. Olay tabanli iletisimde, bir servis bir degisiklik yaptiginda bir olay yayinlar ve diger servisler bu olaya abone olur. Bu desen, servisler arasinda gevsek baglanti saglar ancak nihai tutarlilik (eventual consistency) garantisi verir.
CQRS (Command Query Responsibility Segregation), okuma ve yazma modellerini ayiran bir desendir. Yazma islemleri bir model (komut) uzerinden, okuma islemleri ise farkli bir model (sorgu) uzerinden gerceklestirilir. Bu desen, ozellikle okuma ve yazma yukunun cok farkli oldugu sistemlerde kullanislidir.
Event Sourcing, verideki tum degisiklikleri bir olay akisi olarak saklama desenidir. Her degisiklik, bir olay olarak kaydedilir ve mevcut durum bu olaylarin oynatilmasiyla elde edilir. Event Sourcing, denetim (audit) ve gecmise donuk sorgulama gerektiren sistemlerde idealdir ancak uygulama karmasikligi yuksektir.
Veritabani secim rehberi
Veritabani secimi, uygulamanizin veri modeline ve erisim desenine baglidir. Yanlis veritabani secimi, ileride maliyetli bir degisiklik gerektirebilir. Iste bir karsilastirma:
- PostgreSQL: Karmasik iliskisel veri, JSONB, tam metin aramasi ve yuksek tutarlilik gereksinimleri icin en iyi secenek.
- MySQL: Basit iliskisel veri ve yuksek okuma performansi gerektiren uygulamalar icin iyi bir secenek.
- MongoDB: Esnek sema, hizli prototipleme ve yatay olcekleme gerektiren uygulamalar icin ideal.
- Redis: Onbellek, oturum yonetimi ve gercek zamanli veri icin. Verinin kalici olmasi gerekmiyorsa en hizli secenek.
- Cassandra: Yuksek yazma performansi ve yatay olcekleme gerektiren, buyuk olcekli zaman serisi verisi icin ideal.
Veritabani seciminde en onemli kural: isinize en uygun araci secin. Populer olan degil, uygulamanizin gereksinimlerini karsilayan veritabanini kullanin.
