Veritabanında Normalizasyon Kuralları

Veritabanı tasarımı ilerde karşılaşılabilecek olası hataların önüne geçebilmek adına bazı kurallar dahilinde yapılır. Normalizasyon, veritabanı tasarımında kullanılan bir süreçtir.

Normalizasyon Nedir?

Normalizasyonun öncelikli amacı veri tekrarını en aza indirmektir. Tekrarlanan veri  sadece kaynak israfına neden olmaz , aynı zamanda tutarsız verilerin depolanmasına neden olur. Bir veritabanı uygun bir şekilde normalize edildiğinde veri eklemek, güncellemek ve silmek kolaylaşır.  Normalizasyon süreci boyunca veritabanı tasarımcısı, tasarımın belirlenen hedeflere ulaştığının kontrolünü normalizasyon adımları aracılığıyla yapar.

Veri bütünlüğünün bozulması, aşağıdaki durumlarda kendini hissettirecektir:

  • Güncelleme (update) sorunu
  • Ekleme (insert) sorunu
  • Silme (delete) sorunu

5 adet temel normalizasyon adımından bahsedilecektir. Normalizasyon olgusu bir kabul meselesi olup farklı kaynaklarda farklı sayıda ve içerikte normalizasyon adımlarına rastlanabilir. Normalizasyon adımlarının tamamı uygulanmasa da mutlaka sırayla uygulanmalıdır.

Veritabanı terminolojisinde normalizasyon adımları «normal form» olarak isimlendirilmektedir. Her adımda farklı bir kural uygulanarak farklı bir soruna çözüm üretilmektedir.

  • 1. normal form
  • 2. normal form
  • 3. normal form
  • 4. normal form
  • 5. normal form

Normalizasyon adımları üyelerin ödünç kitap alabildiği bir «kütüphane veritabanı» üzerinde uygulanacaktır. Kitapları belirtmede kullanılabilecek ISBN numarası, kitabın yazarları vb. gibi özellikler veritabanını basit tutabilmek amacıyla kullanılmayacaktır. Yalnızca tüm normalizasyon adımlarının uygulanabilmesini sağlayacak alanlarla çalışılacaktır.

Normalize Edilmemiş Form (Unnormalized Normal Form – UNF):

Yukarıdaki tabloda ne tür sıkıntılar yaşanabilir?

  • Bir kitap hiçbir üye tarafından alınmamışsa kaydı bulunmayacaktır.
  • Tek bir kitap türü olan kitaplar için Kitap_Tur2 alanı her zaman boş kalacaktır. Peki, 3 farklı türü olan bir kitap gelirse ne olacak?
  • Kitap_Tur alanı 1, 2, 3… olarak tekrar etmektedir.
  • Kitap_Adi, Kitap_Tur, Uye_Ad_Soyad, Uye_Bilgi alanlarında tekrarlanan çok fazla kayıt mevcut.

1. Normal Form:

  • Tekrarlanan alanlar ortadan kaldırılır. Kitap_Tur1 ve Kitap_Tur2 kaldırılarak Kitap_Tur olarak birleştirildi.
  • Her alanda tek değer bulunmalıdır. Uye_Ad_Soyad alanları ayrıldı: Uye_Ad, Uye_Soyad

1. Normal Form Sorunları:

  • Kayıt Ekleme Sorunu: Bir üyenin her ödünç kitap alışında kitap ile ilgili veriler veritabanına bir kez daha ekleniyor. Ayrıca üyenin adı, soyadı ve üye hakkında bilgi de her seferinde girilmek zorunda. «Kelebek» isimli kitap bir üye tarafından her ödünç alınışında veritabanına 2 adet kayıt ekleniyor. (Biyografi ve Macera türlerinin belirtilmesi gerek!)
  • Kayıt Silme Sorunu: Bir üyenin kaydı silinmek istendiğinde, eğer bir kitabı sadece silinecek olan üye almışsa kitabın da bilgisi veritabanından siliniyor. 101 numaralı üye Ahmet Aymaz silinirse «Adı Aylin» isimli kitap da yok olacaktır!
  • Kayıt Güncelleme Sorunu: Bir üyenin bilgisinde güncelleme yapılmak istendiğinde birden fazla kayıt üzerinde değişiklik yapılacaktır. 101 numaralı üye Ahmet Aymaz için «Geç ve yıpranmış getiriyor» şeklinde güncelleme yapabilmek için 3 satırın değiştirilmesi gerekir.

2. Normal Form:

  • Veri tekrarını azaltmak amacıyla kavramsal olarak yakın alanlar bağımlılıkları göz önünde bulundurularak ayrı tablolara bölündü. Kitap ile ilgili her şey bir tabloda, üye ile ilgili olanlar diğer tabloda bulunuyor.
  • Bölünen tablolar ortak bir alan ile ilişkilendirildi. (Kitap_No)

3. Normal Form:

  • Veri tekrarını azaltmak amacıyla tanım tabloları oluşturulur.
    • Tanım tabloları aşağıdaki sorulara yanıt vermeyi hedefler:
      • 2 numaralı kitap türü nedir?
      • 34 plakalı şehir nedir?
      • 78 numaralı yazar kimdir?
    • Tanım tabloları ile her bir veri (örn. Macera), kendine özgü bir kimlik değer (örn. 2) ile nitelenir.

4. Normal Form:

Veri tekrarını azaltmak amacıyla çoka-çok (N-N) ilişkileri oluşturabilmek için ilişki tabloları türetilir.

Aşağıdaki değişiklikler yapılmıştır:

  • kitap_odunc tablosu oluşturuldu.
    • uye tablosundaki Kitap_No ve Odunc_Tarih alanları kitap_odunc tablosuna taşındı.
    • kitap_odunc tablosu Uye_No alanı ile uye tablosuna bağlandı.
    • kitap_odunc tablosu Kitap_No alanı ile kitap tablosuna bağlandı.
  • kitap_tur_iliski tablosu oluşturuldu.
    • kitap_tur_iliski tablosu Kitap_No alanı ile kitap tablosuna bağlandı.
    • kitap_tur_iliski tablosu Tur_No alanı ile kitap_tur tablosuna bağlandı.
  • Böylece uye ve kitap tablolarındaki gereksiz tekrarlar tamamen kaldırılmıştır.

4. Normal Form Sorunları:

Tasarım sonucunda kayıtlar içerisinde boş alanlar (NULL) kalabilir.

5. Normal Form:

  • Boş alanların bulunması sorunu yeni bir tablo oluşturularak çözüldü. (uye_bilgi_no)
  • Böylece üye ile ilgili yeni kayıtların girilmesi isteniyorsa istenildiği kadar kayıt eklenebilir ve gerektiğinde silinebilir.

About Hürkal HÜSEM

2010 yılından bu yana Bilişim Teknolojileri Öğretmeni olarak meslek liselerinde görev yapmaktayım.

View all posts by Hürkal HÜSEM →

4 Comments on “Veritabanında Normalizasyon Kuralları”

  1. değerli hocam…
    öncelikle çok teşekkürler… çok yararlandığım bir çalışma. fakat kafama bir soru takıldı. ad soyad bilgisi ad ve soyad olarak 2 alana dönüştürülmüş, amenna… ahmet atmaz yerine ahmet ali atmaz olsaydı sanırım name, last_name ve surname ya da adı ikinci adı ve soyadı alanları tanımlanacaktı. hadi bu yapılabilir diyelim. peki; xxxxxx un, bakliyat, gıda ve turizm san. tic. ltd.şti. olsaydı nasıl yapardık? soru için bağışlayın, bu sizi test etmek için değil pratikte benim de karşılaştığım bir sorun. belki cevap basittir ama bilmeyen için o basit dağ gibi kocamandır… esenlik dileklerimle….

    1. Merhaba Orhan. Yorum için teşekkürler.
      Şirket unvan bilgilerinin açık bir şekilde tek bir alanda kayıt edilmesi, buna ek olarak şirket türlerini ilgilendiren bir çalışma yapılıyorsa N-N ilişki türünde, bir tanım tablosu oluşturularak yapılması yerinde olur. Bu tanım tablosunda da anonim şirket, limited şirketi, şahıs şirketi gibi tanımlamalar bulunabilir.
      Ad ve soyad verilerinin ayrılmasındaki temel amaç; örneğin bu alanlar bitişik olsaydı, adı “Yılmaz” olan kişileri aramak istediğimizde soyadı Yılmaz olan kişileri de görecektik ki bu isteğimiz dışında bir durum olurdu. Her bir alanın asgari düzeyde veriyi taşıyacak şekilde yapılandırılması sayesinde bu tür sorunların önüne geçebiliriz. Benzer durum adres alanı için de geçerlidir. İl, ilçe, mahalle, sokak gibi bilgilerin ayrılmasıyla isabetli bir şekilde “Güngören” adında ister mahalle, ister sokak gibi aramalar yapılabilir. Eğer adresin tamamı tek bir alana yazılırsa ve yalnızca Güngören ilçesi görüntülenecek olsa bile bu sefer ilgilenmediğimiz Güngören Mahallesi, Güngören Sokak gibi verilerle de karşılaşacaktık.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.