Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
Data Modeling Nedir? Requirement'tan Conceptual, Logical ve Physical Modele
Data modeling, hangi veriyi hangi kurallarla saklayacağına kod yazmadan önce karar vermektir; şema yanlışsa hiçbir index onu doğru yapmaz. Conceptual, logical ve physical seviyeleri, requirement cümlelerinden entity, ilişki ve kural çıkarmayı, access pattern listesini ve ekran class'ından türetilen EF Core şemasının neden tek bir JSON'lu tabloya dönüştüğünü Bookstore üzerinden gösteriyoruz.
ER Modeling: Entity, Attribute, Relationship ve Crow's Foot Notation
ER modeling, veriyi entity, attribute ve relationship olarak çizer; bir ilişkiyi doğru anlatmak için her iki ucun hem maksimumu (cardinality) hem minimumu (optionality) gerekir. Simple, composite, multivalued ve derived attribute'ları, unary, binary ve ternary ilişkileri, Chen ile Crow's Foot notation'larını, Bookstore'un Mermaid erDiagram taslağını ve SQL Server catalog view'larından diyagram üretmenin neyi kaybettiğini gösteriyoruz.
İlişkileri Modellemek: One-to-One, One-to-Many, Many-to-Many, Self-Reference ve Weak Entity
İlişkiler tablolara modelden türetilen kurallarla iner: 1-N'de foreign key çok tarafındadır, M-N kendi kimliği olan bir associative entity'dir, 1-1'de foreign key opsiyonel taraftadır ve primary key'dir. SQL Server'da rol eklenince primary key'i değişen bağlantı tablosunu, self-reference'taki döngü tuzağını, iki binary'ye bölününce sahte satır üreten ternary ilişkiyi, weak entity'den ON DELETE CASCADE türetmeyi ve nullable foreign key'in iki anlamını gösteriyoruz.
Key'ler ve Primary Key Seçimi: Candidate Key, Natural ve Surrogate Key, Composite Key
Surrogate key natural key'in yerine geçmez, onun yükünü taşır: kimlik IDENTITY ya da GUID'de, iş kuralındaki benzersizlik UNIQUE constraint'te durur. Superkey'den candidate key'e zinciri, iyi bir primary key'in beş özelliğini, ISBN, e-posta ve kimlik numarasının key olarak tuzaklarını, composite foreign key'in yakaladığı kuralı ve maliyetini, fiziksel tip kararını ve PostgreSQL 18'in uuidv7() fonksiyonunu gösteriyoruz.
Functional Dependency ve Anomaliler: Düz Tablo Neden Bozulur?
Düz tablo bozulur, çünkü bir satırı birden çok bağımsız olguyu birlikte taşır; insert, update ve delete anomaly'leri bunun üç yüzüdür. Sipariş Excel'ini SQL Server'a yükleyip üç anomaly'yi canlı gösteriyor, functional dependency, determinant, full, partial ve transitive dependency'yi tanımlıyor, closure'ı bir T-SQL procedure'üyle hesaplayıp candidate key'i buluyor ve veriden dependency keşfetmenin neden yanılttığını gösteriyoruz.
1NF, 2NF ve 3NF: Sipariş Tablosunu Adım Adım Normalize Etmek
Normalizasyon tabloyu dependency'lere göre böler: 1NF listeleri satırlara açar, 2NF partial, 3NF transitive dependency'leri ayırır ve determinant yeni tablonun key'i olduğu için birleştirme kayıpsız olur. Sipariş Excel'ini SQL Server'da STRING_SPLIT ile 1NF'e, ardından 2NF ve 3NF'e taşıyor, her adımda EXCEPT ile kayıp ve sahte satır olmadığını kanıtlıyor, JSON kolonunun 1NF ile ilişkisini ve sonucu Bookstore şemasına eşlemeyi gösteriyoruz.
BCNF, 4NF, 5NF ve Ötesi: 3NF Ne Zaman Yetmez?
3NF yalnızca key olmayan attribute'lara bakar; bu yüzden tüm kolonları key'in parçası olan bir tablo 3NF'te olup yine de anomaly üretebilir. BCNF, 4NF ve 5NF bu boşlukları kapatır. SQL Server'da imza günü tablosuyla BCNF'i ve kaybolan dependency'yi indexed view ile geri getirmeyi, dil ve tür örneğiyle 4NF'i, dağıtımcı tablosuyla 5NF'teki join dependency'yi ve 6NF'in temporal veriyle ilişkisini gösteriyoruz.
Denormalization: Ne Zaman, Nasıl ve Tutarlılığı Kim Korur?
Denormalization, ölçümle verilen bir performans kararıdır: önce doğru index denenir, yetmezse kopya veri, onu güncel tutacak bir mekanizmayla birlikte saklanır. SQL Server'da kitap kartındaki yorum sayısı ve ortalama puanı her seferinde hesaplamayı, trigger ile books'ta tutmayı ve indexed view'ı logical reads ile karşılaştırıyor; persisted computed column, özet tablo ve tutarlılığı kimin koruduğunu gösteriyoruz.
Modeling Anti-Pattern'leri: EAV, Virgülle Ayrılmış Liste, Tekrarlayan Kolonlar ve Tek Büyük Lookup Tablosu
Modeling anti-pattern'leri, veritabanının tip, benzersizlik ve foreign key kontrollerini devre dışı bırakan kısayollardır; hepsi bir sorguda sessizce yanlış sonuç verir. SQL Server'da EAV'nin kaybettiği satırı ve JSON kolon alternatifini, virgülle ayrılmış etiketlerin LIKE tuzağını, phone1/phone2/phone3'ün yazılamayan kuralını, tek büyük lookup tablosunun yanlış foreign key'ini, her şeyi nullable bırakmayı ve para için FLOAT'ı gösteriyoruz.
OLTP ve OLAP Modeling: Dimensional Model, Star Schema ve Slowly Changing Dimension
Normalize OLTP şeması yazma için, dimensional model okuma için tasarlanır: önce grain ilan edilir, ölçüler fact tablosuna, bağlam denormalize dimension'lara gider. SQL Server'da Bookstore satışlarından star schema kuruyor, aynı raporun OLTP sorgusunda neden satış kaybettiğini, kategori değişince Type 1, 2 ve 3 slowly changing dimension'ın geçmiş raporlara etkisini, grain karışınca çift saymayı ve columnstore'u gösteriyoruz.
İlişkisel mi Document mı? Aynı Bookstore'u İki Şekilde Modellemek
İlişkisel model "veri nedir?" diye, document model "veriye nasıl erişeceğim?" diye sorar; ikisi de model ister, yalnızca sınırları farklı yere çizer. Bookstore siparişini MongoDB'de kalemleri gömülü bir document olarak kuruyor, aggregate sınırını, document modeldeki update anomaly'yi, $lookup tuzağını ve schema validation'ı gösteriyor, SQL Server 2025'te ilişkisel veriden JSON document üretip PostgreSQL jsonb ile karşılaştırıyoruz.
Uçtan Uca: Bookstore Şemasını Sıfırdan Tasarlamak ve Şema Review Checklist'i
İyi bir şema, requirement cümlelerindeki kuralların constraint olarak yazıldığı şemadır; kuralların çoğu cümlelerin arasında saklıdır. Ön sipariş, kupon ve stok rezervasyonu requirement'larından entity listesi, Mermaid ER diyagramı, closure ile BCNF kontrolü ve SQL Server DDL'ine gidiyor, constraint'leri iş kurallarına karşı test ediyor, açıklamaları şemada tutuyor, EF Core migration'ını review ediyor ve bir şema review checklist'i çıkarıyoruz.