Veritabanı Tasarımı

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.

Veri Tabanım Editörlüğü · 5 dk okuma
Bu yazıda neler var?
  1. Normalizasyon Hangi Sorunları Çözer?
  2. Anahtarlar ve İşlevsel Bağımlılıklar Nasıl Belirlenir?
  3. Birinci Normal Form (1NF) Nasıl Uygulanır?
  4. İkinci Normal Form (2NF) Nasıl Uygulanır?
  5. Üçüncü Normal Form (3NF) Nasıl Uygulanır?
  6. BCNF, 4NF ve 5NF Ne Zaman İncelenir?
  7. Normalizasyon Adım Adım Nasıl Uygulanır?
  8. 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ÖrnekTablo tasarımıyla çözüm
GüncellemeŞehir adı bazı müşteri satırlarında eski kalır.Şehir adını Sehirler tablosunda tutun.
EklemeMüşterisi olmayan bir şehri kaydedemezsiniz.Şehri müşteri kaydından bağımsız ekleyin.
SilmeSon 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.

TabloSütunlarÖrnek kayıt
MusterilerMusteriID, MusteriAdi12, Ayşe Kaya
MusteriTelefonlariTelefonID, MusteriID, Telefon1, 12, 0532...
MusteriTelefonlariTelefonID, MusteriID, Telefon2, 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.

TabloAnahtarSaklanan bilgi
UrunlerUrunIDUrunAdi
SiparisDetaySiparisID, UrunIDAdet

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.

TabloBirincil anahtarDiğer sütunlar
MusterilerMusteriIDMusteriAdi, SehirID
SehirlerSehirIDSehirAdi

Ş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 durumTasarım kararı
BCNFAnahtar olmayan belirleyicinin yol açtığı tekrarİşlevsel bağımlılığa göre tabloyu ayırın.
4NFBirbirinden bağımsız çok değerli bağımlılıklarBağımsız ilişkileri ayrı tablolarda tutun.
5NFBirleş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.

  1. Her konu için tabloyu ve birincil anahtarı belirleyin.
  2. İşlevsel bağımlılıkları sütun adlarıyla yazın.
  3. Önce 1NF, sonra 2NF ve 3NF koşullarını kontrol edin.
  4. Yabancı anahtarları ve gerekli tekillik kısıtlarını ekleyin.
  5. Verileri taşıyın; kayıtları ve örnek sorguların sonuçlarını karşılaştırın.
  6. 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.

HataBelirtiÇözüm
Listeyi tek hücrede saklamakTelefon alanında 2 numara bulunur.Numaraları ilişkili satırlara ayırın.
Tekrarlayan sütun açmakUrun1, Urun2, Urun3 alanları oluşur.SiparisDetay gibi bir ara tablo kullanın.
Gereksiz ayrıştırma yapmakSorgular ç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ı?
Evet. Önce mevcut verilerin yedeğini alın ve tekrar eden alanları belirleyin. Yeni tabloları oluşturup kayıtları bu tablolara taşıyan bir geçiş hazırlayın. Taşıma öncesi ve sonrası kayıt sayılarını, ilişkileri ve sorgu sonuçlarını karşılaştırın. Uygulamanın eski sütunlara başvuran işlemlerini de yeni şemaya uyarlayın.
Her tabloda yabancı anahtar bulunması gerekir mi?
Hayır. Yabancı anahtar, bir tablodaki kayıt başka bir tablodaki kayda başvurduğunda kullanılır. Bağımsız bir Sehirler tablosunun başka tabloya başvurması gerekmez. Müşterinin şehrini Sehirler tablosundan seçiyorsanız Musteriler tablosunda SehirID yabancı anahtarını tanımlayın. Böylece geçersiz şehir kimliklerinin kaydedilmesini kısıtlayabilirsiniz.
Birincil anahtar eklemek tabloyu otomatik olarak 3NF yapar mı?
Hayır. Birincil anahtar satırları ayırt eder; diğer sütunlar arasındaki bağımlılıkları ortadan kaldırmaz. Müşteri satırlarına tekil bir kimlik ekleseniz bile SehirID şehir adını belirlemeyi sürdürür. 3NF kontrolünde önce alt normal formları inceleyin. Ardından anahtar olmayan alanlar arasındaki geçişli bağımlılıkları belirleyin.

Kaynaklar

  1. Veritabanı normalizasyonu: nedir, amaçları ve net örnekleri
  2. Veritabanı Normalizasyonu: Temel Bilgiler ve Uygulamalar
  3. Veritabanı normalizasyonu: normal formlar ve pratik örnekler
  4. İlişkisel Veritabanı Normalizasyonu: 1NF, 2NF, 3NF Rehberi - Berk Akademi
  5. 1NF, 2NF ve 3NF ile Veritabanı Normalizasyonu · SonsuzUs
  6. Veritabanı Tasarımı: Normalizasyon ve Tasarım Kalıpları