🧩 Veritabanı Normalizasyonu ve Örnekli Uygulama Rehberi
💡 Bu Rehberde Ne Öğreneceksiniz?
Bu rehberde veritabanı normalizasyonu kavramını temelden öğreneceksiniz.
Amacımız, veri tekrarını azaltmak, veri bütünlüğünü güçlendirmek ve ölçeklenebilir, verimli veritabanı yapıları kurmanızı sağlamak.
Adım adım şu konulara değineceğiz:
- Normalizasyonun amacı ve neden gerekli olduğu
- 1NF, 2NF, 3NF ve BCNF aşamalarının farkları
- Her form için pratik SQL örnekleri
- Denormalizasyonun ne zaman tercih edileceği
🔍 Kısacası: Bu rehber, düzensiz verileri nasıl mantıklı tablolara dönüştüreceğinizi öğretir.
🧠 Veritabanı Normalizasyonu Nedir?
Normalizasyon, ilişkisel veritabanlarında verileri düzenleyip tekrarı azaltmak ve tutarlılığı artırmak için kullanılan sistematik bir tasarım tekniğidir.
Amaç, büyük bir tabloyu daha küçük, anlamlı ve ilişkili tablolara bölmektir.
🎯 Temel Hedefler
- Veri Tekrarını Önlemek: Aynı veriyi birden fazla yerde saklamamak.
- Veri Bütünlüğü Sağlamak: Tablolar arası ilişkileri netleştirerek hatalı veri girişlerini önlemek.
- Anormallikleri Engellemek:
- Ekleme anormalliği: Eksik veri yüzünden yeni kayıt eklenememesi.
- Güncelleme anormalliği: Aynı bilginin birçok yerde değiştirilmesi gerekmesi.
- Silme anormalliği: Bir kaydın silinmesiyle istenmeyen verilerin de kaybolması.
- Sorgu Performansını Artırmak: Düzenli tablolar daha hızlı sorgulanır ve yönetilir.
🧱 Normalizasyon Aşamaları
Normalizasyon, birbirini takip eden dört temel aşamadan oluşur:
1NF → 2NF → 3NF → BCNF
1️⃣ Birinci Normal Form (1NF)
Kural: Her sütun atomik (tekil) bir değer içermelidir.
| Müşteri ID | Müşteri Adı | Satın Alınan Ürünler |
|---|---|---|
| 101 | Ahmet Kaya | Laptop, Mouse |
| 102 | Elif Demir | Tablet |
Sorun: “Satın Alınan Ürünler” hücresi birden fazla değer içeriyor.
1NF’ye Dönüştürülmüş Hali:
| Müşteri ID | Müşteri Adı | Ürün |
|---|---|---|
| 101 | Ahmet Kaya | Laptop |
| 101 | Ahmet Kaya | Mouse |
| 102 | Elif Demir | Tablet |
CREATE TABLE MusteriUrunleri (
MusteriID INT,
MusteriAdi VARCHAR(100),
Urun VARCHAR(100)
);
🧩 Bu tablo artık 1NF’e uygundur. Her hücre tek bir değere sahiptir.
2️⃣ İkinci Normal Form (2NF)
Kural: Tablo 1NF olmalı ve kısmi bağımlılıklar kaldırılmalıdır.
Sipariş ID Müşteri ID Müşteri Adı Ürün 201 101 Ahmet Kaya Laptop 202 101 Ahmet Kaya Mouse
Sorun: “Müşteri Adı” sadece “Müşteri ID”ye bağlı, birleşik anahtara değil.
2NF’ye Dönüşüm:
Müşteri bilgileri ayrı bir tabloya taşınır.
CREATE TABLE Musteriler (
MusteriID INT PRIMARY KEY,
MusteriAdi VARCHAR(100)
);
CREATE TABLE Siparisler (
SiparisID INT PRIMARY KEY,
MusteriID INT,
Urun VARCHAR(100),
FOREIGN KEY (MusteriID) REFERENCES Musteriler(MusteriID)
);
🧠 Artık kısmi bağımlılıklar yok. Müşteri bilgisi tek bir yerde saklanıyor.
3️⃣ Üçüncü Normal Form (3NF)
Kural: Tablo 2NF olmalı ve geçişli bağımlılıklar kaldırılmalıdır.
| Sipariş ID | Ürün | Tedarikçi |
|---|---|---|
| 201 | Laptop | HP |
| 202 | Mouse | Logitech |
Sorun: “Tedarikçi”, doğrudan “Ürün”e bağlı. Bu, geçişli bağımlılıktır.
3NF’ye Dönüşüm: Ürün ve tedarikçi bilgilerinin ayrı tablolara taşınması gerekir.
CREATE TABLE Tedarikciler (
TedarikciID INT PRIMARY KEY,
TedarikciAdi VARCHAR(100)
);
CREATE TABLE Urunler (
UrunID INT PRIMARY KEY,
UrunAdi VARCHAR(100),
TedarikciID INT,
FOREIGN KEY (TedarikciID) REFERENCES Tedarikciler(TedarikciID)
);
💡 Artık her sütun sadece anahtarına bağlı. Veri bütünlüğü tam.
4️⃣ Boyce-Codd Normal Form (BCNF)
Kural: Her fonksiyonel bağımlılıkta belirleyici (X) bir süper anahtar olmalıdır.
| Öğrenci ID | Ders | Eğitmen |
|---|---|---|
| 1 | Matematik | Dr. Yılmaz |
| 2 | Matematik | Dr. Yılmaz |
Sorun: Ders → Eğitmen ilişkisi var ama “Ders” süper anahtar değil.
BCNF’ye Dönüşüm:
CREATE TABLE OgrenciDersler (
OgrenciID INT,
Ders VARCHAR(100),
PRIMARY KEY (OgrenciID, Ders)
);
CREATE TABLE DersEgitmenler (
Ders VARCHAR(100) PRIMARY KEY,
Egitmen VARCHAR(100)
);
🧩 BCNF, 3NF’den daha katı kurallara sahiptir ve karmaşık bağımlılıkları ortadan kaldırır.
⚖️ Normalizasyon ve Denormalizasyon Dengesi Kriter Normalizasyon Denormalizasyon Veri Tekrarı Az Fazla Tutarlılık Yüksek Orta Performans Güncellemelerde hızlı Okumalarda hızlı Kullanım Alanı İşlem tabanlı sistemler Analitik sistemler
🚀 İpucu: Raporlama veya analitik sistemlerde denormalizasyon, okuma performansını ciddi ölçüde artırabilir.
💬 Sıkça Sorulan Sorular (SSS)
- Normalizasyonda hangi seviye genelde yeterlidir?
Çoğu sistemde 3NF yeterlidir. BCNF yalnızca karmaşık bağımlılık durumlarında gerekir.
- Kısmi ve geçişli bağımlılık farkı nedir?
Kısmi bağımlılık, birleşik anahtarın bir kısmına bağlılık; geçişli bağımlılık, anahtar olmayan bir alanın başka bir anahtar olmayan alana bağımlılığıdır.
- BCNF her zaman gerekli midir?
Hayır. BCNF genellikle özel, çok karmaşık veri ilişkilerinde tercih edilir.
- NoSQL veritabanlarında normalizasyon geçerli midir?
Genel olarak hayır. NoSQL yapılar denormalizasyonu performans için tercih eder.
- Normalizasyon performansı düşürür mü?
Çok fazla tabloya bölünmesi join işlemlerini artırır; ancak veri bütünlüğü açısından bu kayıp kabul edilebilir düzeydedir.
🏁 Sonuç
Veritabanı normalizasyonu, düzenli, güvenilir ve ölçeklenebilir sistemlerin temelidir. Doğru uygulandığında, hem verimliliği artırır hem de veri hatalarını ortadan kaldırır.
💡 Projelerinizde bu ilkeleri uygulayarak güçlü veri temelleri kurabilirsiniz. Rabisu Bulut üzerinde kendi veritabanınızı oluşturun ve normalizasyonun farkını deneyimleyin.