Veritabanı Normalizasyonu Nedir? Normal Formlar
Normalizasyon, farklı konulara ait verileri ilişkili tablolarda tutarak tekrarları azaltır. 1NF hücrelerdeki değerleri, 2NF kısmi bağımlılıkları, 3NF ise geçişli bağımlılıkları inceler.
Bu yazıda neler var?
- Normalizasyon Hangi Sorunları Çözer?
- Anahtarlar ve İşlevsel Bağımlılıklar Nasıl Belirlenir?
- Birinci Normal Form (1NF) Nasıl Uygulanır?
- İkinci Normal Form (2NF) Nasıl Uygulanır?
- Üçüncü Normal Form (3NF) Nasıl Uygulanır?
- BCNF, 4NF ve 5NF Ne Zaman İncelenir?
- Normalizasyon Adım Adım Nasıl Uygulanır?
- Sık Yapılan Hatalar ve Çözümleri
Veritabanı normalizasyonu, bilgileri ilişkili tablolara ayırarak veri tekrarını ve tutarsızlığı azaltır. İlk 3 normal form; hücreleri, anahtara bağımlılıkları ve tablolar arasındaki bilgi dağılımını düzenler. Bu düzen, ekleme, güncelleme ve silme sırasında veri bütünlüğünü korumaya yardımcı olur.
Normalizasyon Hangi Sorunları Çözer?
Aynı şehir adını her müşteri kaydında sakladığınızı düşünün. Ad değiştiğinde bazı satırları güncellemeyi atlarsanız kayıtlar çelişir. Şehirleri ayrı tabloda tutup müşterileri şehir kimliğiyle ilişkilendirmek bu tekrarı azaltır.
Normalizasyon özellikle 3 veri anomalisini hedefler. Bunlar, bir değişikliğin eksik uygulanması, bağımsız bir kaydın eklenememesi ve başka bir kayıt silinirken bilginin kaybolmasıdır. Ayrı tablolar, bu bilgilerin kendi yaşam döngüleriyle saklanmasını sağlar.
| Anomali | Örnek | Tablo tasarımıyla çözüm |
|---|---|---|
| Güncelleme | Şehir adı bazı müşteri satırlarında eski kalır. | Şehir adını Sehirler tablosunda tutun. |
| Ekleme | Müşterisi olmayan bir şehri kaydedemezsiniz. | Şehri müşteri kaydından bağımsız ekleyin. |
| Silme | Son müşteriyi silince şehir bilgisi de kaybolur. | Şehir kaydını ayrı tabloda koruyun. |
Anahtarlar ve İşlevsel Bağımlılıklar Nasıl Belirlenir?
Her tablonun hangi konuyu temsil ettiğini ve satırlarının nasıl ayırt edileceğini belirleyin. Musteriler tablosunda MusteriID, her müşteri kaydını tekil olarak tanımlayan birincil anahtar olabilir. Siparisler tablosundaki MusteriID ise müşteri kaydına başvuran yabancı anahtardır.
- Bileşik anahtar: Bir kaydı birlikte tanımlayan 2 veya daha fazla sütundur.
- İşlevsel bağımlılık: Bir değerin başka bir alan ya da alan kümesi tarafından belirlenmesidir. MusteriID → MusteriAdi buna örnektir.
- Ara tablo: Çoktan çoğa ilişkiyi iki ayrı ilişkiye dönüştürür. SiparisDetay, SiparisID ve UrunID sütunlarını taşıyabilir.
Ara tablodaki iki kimliğin birlikte tekil olması gerekiyorsa bileşik anahtar veya tekillik kısıtı kullanın. İlişkisel sistemler hakkında ayrıca SQL Server, PostgreSQL ve MySQL yazılarına bakın.
Birinci Normal Form (1NF) Nasıl Uygulanır?
1NF için her sütundaki değer, o sütunun tanımladığı alanda tek bir değer taşımalıdır. Telefonlar sütununa virgülle ayrılmış 2 numara yazmayın. Telefon1 ve Telefon2 gibi tekrarlayan sütunlar da açmayın. Numaraları müşteriyle ilişkili ayrı satırlarda saklayın.
| Tablo | Sütunlar | Örnek kayıt |
|---|---|---|
| Musteriler | MusteriID, MusteriAdi | 12, Ayşe Kaya |
| MusteriTelefonlari | TelefonID, MusteriID, Telefon | 1, 12, 0532... |
| MusteriTelefonlari | TelefonID, MusteriID, Telefon | 2, 12, 0544... |
Bu yapıda her telefon numarası kendi kaydıyla tutulur. Yeni bir numara eklemek için müşteri tablosuna sütun eklemeniz gerekmez. MusteriID yabancı anahtarı, telefon satırının hangi müşteriye ait olduğunu gösterir.
İkinci Normal Form (2NF) Nasıl Uygulanır?
2NF kontrolüne başlamadan önce 1NF koşulunu sağlayın. Bileşik aday anahtar varsa anahtar olmayan sütunların anahtarın tamamına bağlılığını inceleyin. Yalnızca anahtarın bir parçasının belirlediği bilgi, kısmi bağımlılık oluşturur.
SiparisDetay tablosunda (SiparisID, UrunID) çiftinin bir satırı tanımladığını varsayın. Adet, sipariş ile ürünün birlikte belirlediği satır bilgisidir. UrunAdi ise yalnızca UrunID tarafından belirlenir. Bu nedenle ürün adını Urunler tablosuna taşıyın.
| Tablo | Anahtar | Saklanan bilgi |
|---|---|---|
| Urunler | UrunID | UrunAdi |
| SiparisDetay | SiparisID, UrunID | Adet |
Tek sütunlu aday anahtarın parçasına bağımlılık kurulamaz. Ancak tabloya sonradan tekil bir sıra numarası eklemek, ürün adının neden tekrarlandığını çözmez. Doğal bağımlılıkları da inceleyin.
Üçüncü Normal Form (3NF) Nasıl Uygulanır?
3NF için önce 2NF koşullarını sağlayın. Ardından anahtar olmayan bir alanın başka bir anahtar olmayan alanı belirleyip belirlemediğini inceleyin. Böyle bir zincir varsa geçişli bağımlılığı ayırın.
Musteriler tablosunda MusteriID → SehirID → SehirAdi zincirini düşünün. Müşterinin kimliği şehir kimliğini, şehir kimliği de şehir adını belirler. SehirAdi alanını Sehirler tablosuna taşıyın. Musteriler tablosunda yalnızca SehirID başvurusu kalsın.
| Tablo | Birincil anahtar | Diğer sütunlar |
|---|---|---|
| Musteriler | MusteriID | MusteriAdi, SehirID |
| Sehirler | SehirID | SehirAdi |
Şehir adını değiştirdiğinizde artık müşteri satırlarını ayrı ayrı güncellemezsiniz. Bu örnekte SehirID, Musteriler tablosunda yabancı anahtar görevini üstlenir.
BCNF, 4NF ve 5NF Ne Zaman İncelenir?
3NF, tablo tasarımını denetlemek için uygun bir başlangıçtır. Bazı bağımlılıklar ise daha ileri normal formları incelemeyi gerektirir. BCNF, her önemsiz olmayan işlevsel bağımlılıkta belirleyici tarafın süper anahtar olmasını ister.
| Normal form | İncelenen durum | Tasarım kararı |
|---|---|---|
| BCNF | Anahtar olmayan belirleyicinin yol açtığı tekrar | İşlevsel bağımlılığa göre tabloyu ayırın. |
| 4NF | Birbirinden bağımsız çok değerli bağımlılıklar | Bağımsız ilişkileri ayrı tablolarda tutun. |
| 5NF | Birleşim bağımlılıkları | Ayrılan tabloların doğru kayıtları yeniden ürettiğini sınayın. |
Örneğin bir öğretmenin verdiği dersler ile uzmanlık alanları birbirinden bağımsızsa bunları ayrı ilişkilerde tutun. Aynı tabloda birleştirmek gereksiz ders-uzmanlık eşleşmeleri üretir. Daha ileri ayrıştırmalarda hangi kayıtların yeniden oluşacağını iş kurallarıyla denetleyin.
Normalizasyon Adım Adım Nasıl Uygulanır?
Önce verileri ve iş kurallarını yazın. Müşteri, sipariş, ürün ve şehir gibi konuları ayırın. Ardından alanların hangi anahtar tarafından belirlendiğini kaydedin. Çoktan çoğa ilişkiler için ara tablo tasarlayın.
- Her konu için tabloyu ve birincil anahtarı belirleyin.
- İşlevsel bağımlılıkları sütun adlarıyla yazın.
- Önce 1NF, sonra 2NF ve 3NF koşullarını kontrol edin.
- Yabancı anahtarları ve gerekli tekillik kısıtlarını ekleyin.
- Verileri taşıyın; kayıtları ve örnek sorguların sonuçlarını karşılaştırın.
- Sık kullanılan sorguların planlarını ve çalışma sürelerini ölçün.
SiparisDetay tablosunda işlem anındaki fiyatı saklamak ayrı bir iş kuralıdır. Ürünün güncel fiyatı sonradan değişse bile eski siparişin fiyatı korunur. Belge tabanlı bir modelle karşılaştırma için MongoDB ve SQL farkları yazısına bakın. İlişkileri sorgulamak için SQL öğrenme adımlarından yararlanın.
Sık Yapılan Hatalar ve Çözümleri
Bir tabloyu yalnızca sütun adlarına bakarak bölmeyin. Önce her alanın hangi kayda ve iş kuralına ait olduğunu belirleyin. Örneğin ürünün güncel fiyatıyla sipariş anındaki fiyatı aynı anlamda değerlendirmeyin.
| Hata | Belirti | Çözüm |
|---|---|---|
| Listeyi tek hücrede saklamak | Telefon alanında 2 numara bulunur. | Numaraları ilişkili satırlara ayırın. |
| Tekrarlayan sütun açmak | Urun1, Urun2, Urun3 alanları oluşur. | SiparisDetay gibi bir ara tablo kullanın. |
| Gereksiz ayrıştırma yapmak | Sorgular çok sayıda JOIN kullanır. | Gerçek sorguların planını ve süresini ölçün. |
Normalizasyon bazı okuma sorgularında ek JOIN maliyeti doğurur. Önce doğru ilişkileri ve indeksleri kurun, ardından ölçülen darboğazı inceleyin. Denormalizasyon uygularsanız kopyalanan verinin nasıl güncelleneceğini tanımlayın. Böylece kaynak kayıt değiştiğinde hangi işlemin eşzamanlama yapacağı açık olur.
Sık sorulan sorular
Mevcut bir veritabanına normalizasyon sonradan uygulanır mı?
Her tabloda yabancı anahtar bulunması gerekir mi?
Birincil anahtar eklemek tabloyu otomatik olarak 3NF yapar mı?
Kaynaklar
- Veritabanı normalizasyonu: nedir, amaçları ve net örnekleri
- Veritabanı Normalizasyonu: Temel Bilgiler ve Uygulamalar
- Veritabanı normalizasyonu: normal formlar ve pratik örnekler
- İlişkisel Veritabanı Normalizasyonu: 1NF, 2NF, 3NF Rehberi - Berk Akademi
- 1NF, 2NF ve 3NF ile Veritabanı Normalizasyonu · SonsuzUs
- Veritabanı Tasarımı: Normalizasyon ve Tasarım Kalıpları