Bir gün uyandığınızı ve şirketinizin tüm müşteri verilerinin, siparişlerinin ve ürün stoklarının tek bir Excel dosyasında, rastgele girildiğini hayal edin. Bir müşterinin adresini güncellemek için 500 satırı değiştirmeniz gerekiyor; bir satırı sildiğinizde ise o ayki tüm satış raporlarınız yok oluyor. İşte bu, veri anomalisinin tam kendisidir.
Veritabanı dünyasında bu kaostan kurtulmanın yolu Normalizasyon basamaklarını tırmanmaktan geçer. Gelin, “Kabus Tablo” adını verdiğimiz bir yapıyı alalım ve onu modern bir veritabanı mimarisine dönüştürelim.
0. Adım: Kaosun Başlangıcı (0NF)
Elimizde her şeyin iç içe geçtiği bir tablo var. Bir satırda birden fazla kurs, her kursta farklı eğitmenler ve tekrarlayan bilgiler…
Kabus Tablo (Normalleşmemiş)
| OgrenciID | OgrenciAdı | AlınanKurslar | KursEgitmeni | KursUcreti |
|---|---|---|---|---|
| 1001 | Ahmet Yılmaz | SQL, Python, Java | Berk Can, Elif Su | 1200 |
| 1002 | Elif Tan | SQL | Berk Can | 400 |
[!CAUTION] Buradaki Sorunlar:
- Atomik Olmayan Veri:
AlınanKurslarsütununda birden fazla değer var. Programatik olarak bir öğrencinin kaç kurs aldığını saymak bile bir işkence.
-
Veri Tekrarı: Berk Can ismi her SQL kursunda tekrar edecek.
-
Silme Anomalisi: Ahmet Yılmaz kaydını silersek, Java kursunun bilgisini ve ücretini de kaybederiz.
1. Normal Form (1NF): Atomik Güç
Kural: Her hücrede tek bir değer olmalı ve her satır eşsiz olmalıdır.
Neyi Değiştiriyoruz?
AlınanKurslar ve KursEgitmeni sütunlarını parçalıyoruz. Her kursu ayrı bir satır yapıyoruz.
1NF Sonrası Yapı
| OgrenciID | OgrenciAdı | KursAdı | EgitmenAdı | KursUcreti |
|---|---|---|---|---|
| 1001 | Ahmet Yılmaz | SQL | Berk Can | 400 |
| 1001 | Ahmet Yılmaz | Python | Elif Su | 400 |
| 1001 | Ahmet Yılmaz | Java | Elif Su | 400 |
| 1002 | Elif Tan | SQL | Berk Can | 400 |
Neden Detaylı Anlatım: Artık verilerimiz atomik. Ancak hâlâ büyük bir sorunumuz var: Kısmi Bağımlılık. OgrenciAdı sadece OgrenciID‘ye bağlı, ama bu tablonun birincil anahtarı artık (OgrenciID + KursAdı) birleşimidir.
2. Normal Form (2NF): Kısmi Bağımlılıklara Veda
Kural: 1NF sağlanmalı ve anahtar olmayan tüm sütunlar, birleşik anahtarın tamamına bağımlı olmalıdır.
Neyi Değiştiriyoruz?
Sadece öğrenci bilgisini içeren sütunlarını (OgrenciAdı) ve kurs bilgisini içeren sütunlarını (KursUcreti, EgitmenAdı) birbirinden ayırıyoruz.
Tablo: Öğrenciler (2NF)
| OgrenciID | OgrenciAdı |
|---|---|
| 1001 | Ahmet Yılmaz |
| 1002 | Elif Tan |
Tablo: Kurs Kayıtları (2NF)
| OgrenciID | KursAdı | EgitmenAdı | KursUcreti |
|---|---|---|---|
| 1001 | SQL | Berk Can | 400 |
| 1001 | Python | Elif Su | 400 |
[!TIP] Analiz: Bu adımda öğrenci ismini bir kez saklayarak veri tekrarını büyük oranda azalttık. Ancak
KursKayitlaritablosunda hâlâ bir problem var:KursUcretiaslındaKursAdı‘na bağlıdır, eğitmenin kim olduğuyla doğrudan ilgisi yoktur. Bu da bizi 3NF’ye götürür.
3. Normal Form (3NF): Geçişli Bağımlılık Zincirini Kırmak
Kural: 2NF sağlanmalı ve anahtar olmayan sütunlar arasında bağımlılık olmamalıdır (A -> B -> C durumu).
Neyi Değiştiriyoruz?
KursAdı, EgitmenAdı ve KursUcreti arasındaki ilişkiyi koparıp kurs detaylarını kendi tablosuna alıyoruz.
Tablo: Kurs Detayları (3NF)
| KursID | KursAdı | EgitmenAdı | KursUcreti |
|---|---|---|---|
| K1 | SQL | Berk Can | 400 |
| K2 | Python | Elif Su | 400 |
Tablo: Kurs Katılımları (3NF)
| OgrenciID | KursID |
|---|---|
| 1001 | K1 |
| 1001 | K2 |
Sonuç: Artık bir kursun ücretini değiştirmek istediğimizde sadece Kurs Detayları (3NF) tablosunda tek bir hücreyi güncellememiz yeterli. Binlerce kayıt arasında tutarsızlık çıkma ihtimali sıfıra indi!
İleri Formlar: BCNF ve Ötesi
Bazen 3NF bile yetmeyebilir. Özellikle aday anahtarların çakıştığı karmaşık senaryolarda Boyce-Codd Normal Formu (BCNF) devreye girer. BCNF, “Her belirleyici (determinant) bir aday anahtar olmalıdır” der.
Eğer bir eğitmen birden fazla kurs verebiliyorsa ama her kursun sadece bir eğitmeni varsa, bu ilişkiyi de tabloları daha fazla bölerek (Eğitmen-Kurs tablosu gibi) optimize etmek gerekir.
Özet: Hangi Adımda Ne Yaptık?
| Form | İşlem | Hedef |
|---|---|---|
| 1NF | Virgülleri/Listeleri parçala | Atomik hücreler elde et |
| 2NF | Anahtarın bir kısmına bağlı olanları ayır | Anahtar bütünlüğünü sağla |
| 3NF | Sütunlar arası (gizli) bağları kopar | Geçişli bağımlılığı bitir |
| BCNF | Her belirleyiciyi anahtar yap | En üst düzey anahtar kontrolü |
Son Söz
Normalizasyon bir varış noktası değil, bir denge arayışıdır. Veritabanını çok fazla bölerseniz JOIN işlemleri sistemi yorabilir; az bölerseniz veri anomalileri işinizi mahvedebilir. Profesyonel bir tasarımcı, genellikle 3NF veya BCNF seviyesinde durur ve sistemin ihtiyacına göre dengeyi kurar.
Verinizi düzenli tutun, veritabınız size sadık kalsın!