Normalizasyon

İlişkisel veritabanını verimli bir şekilde kullanmak için tekrarlı verileri ve çoktan çoğa ilişkileri en aza indirmek gerekir. Bu amaçla veritabanındaki tablolar düzenli hale getirilir. Bu işleme normalizasyon denilmektedir.

Normalizasyon çok fazla sayıda alan ve kayıtlardan oluşan tabloların tekrarlı verilerden arındırılarak başka tabloların oluşturulması işlemidir. Burada amaç, tablolardan kayıt silme işleminden kaynaklı veri kayıplarını, ve gereksiz yere tabloya kayıt eklemekten kaynaklanan veri tekrarını önlemektir.

Bu işlem, ilişkisel veritabanı modelinin mantıksal tasarım aşamasında uygulanır.

Normalizasyon aşamaları:

•      Birinci Normal Form
•      İkinci Normal Form
•      Üçüncü Normal Form
•      Boyce-Codd Normal Formu
•      Dördüncü Normal Form

Normal olamayan form 

İlişkisel veri tabanı modelinin temel kuralına göre bütün niteliklerin aldığı değerler atomik (tek ve basit) olmalıdır.

Aşağıdaki sipariş tablosu bu kurala uymamaktadır. Örneğin gönderi numarası ve miktar alanları girilirken tablodaki bir hücre birden fazla değer içermektedir, 1 nolu gönderinin miktarı 300, 2 nolu gönderinin miktarı 200 gibi değerler girilmiştir. Bu durum, veritabanı üzerinde sorgulama işlemi yapılmasını zorlaştıracaktır. Bir veritabanı tasarımı için normal bir durum değildir.


Birinci Normal Form 

Bu tabloya Birinci Normal Form uygulandığında aşağıdaki şekilde bir tablo ortaya çıkar.


Ancak bu tabloya birinci normal form uygulandığında da şu sorunlar ortaya çıkmaktadır. Birinci normal formdaki bir tablo bazı alanlarda tekrarlı verilere sahiptir. Örneğimizde şehir_kodu ve şehir_adı alanlarında her müşteri için tekrarlı veriler vardır. Bu tekrarlar kayıt ekleme, silme ve güncelleme işlemlerinde sorunlara neden olacaktır.

Örneğin bu tabloda yer almayan bir müşterinin bilgilerinin (müşteri_no, şehir_kodu, şehir_adı) girilmesi için mutlaka o müşteriye bir sipariş işleminin yapılması (gönderi_no ve miktar değerlerinin girilmiş olması) gerekiyor. Ama müşteri sipariş vermemiş olabilir, bu durumda müşteriyi kaydı gerçekleşmeyecek mi? Ya da müşteri bu tabloya kayıt olduğunda gönderi_no ve miktar alanları boş mu kalacak? 

Diğer yandan bir müşteri için tek bir sipariş alındıysa (örn. 3 no’lu müşteri), o sipariş işlemi iptal edildiğinde, sadece gönderi_no ve miktarı değil, o siparişin yapıldığı müşteri hakkındaki diğer bilgiler de (müşteri_no, şehir_kodu, şehir_adı) yok olur. Ya da 1 numaralı müşteri Ankara’ya taşınırsa, bu müşteri ile ilgili tüm satırların güncellenmesi gerekecek. Eğer tablo çok büyük ise, sadece bir müşteri ile ilgili küçük bir değişiklik bile bir çok kaydın güncellenmesini gerektirebilir.

Yukarıda bahsedilen bu sorunlardan dolayı İkinci Normal Forma ihtiyaç duyulmuştur.

İkinci Normal Form

Birinci normal formdaki sorunlardan kurtulmak için birinci normal form  tabloları birden fazla tabloya dönüştürülerek ikinci normal forma ulaşılır. İkinci normal formda, ilişkisel tablonun her bir anahtar olmayan sütunu birincil anahtara kısmi bağımlı değil, tam işlevsel bağımlı olmalıdır.

Örneğin şehir_kodu ve şehir_adı nitelikleri sadece müşteri_no niteliği üzerinde tam işlevsel bağımlıdır. Bu durumda şehir_kodu ve şehir_adı nitelikleri müşteri_no ile beraber ayrı bir tablo oluşturmalıdır.

Müşteriler Tablosu (müşteri_no, şehir_kodu, şehir_adı)
Sipariş Tablosu (müşteri_no, gönderi_no, miktar)

Birinci normal formdaki güncelleme sorununu ikinci normal forma dönüştürme ile ortadan kaldırmış olsak ta, ikinci normal formda da ekleme ve silme sorunları devam etmektedir.

Örneğin Müşteri tablosuna yeni bir müşteri kaydı girilmediği sürece yeni bir şehir tanımı yapılamaz. İzmir'i tabloya dahil edebilmek için İzmir’de bulunan bir müşteriye ihtiyaç vardır.
Diğer yandan  bu tablodan bir müşteri silindiğinde, eğer o şehirdeki tek müşteri ise şehir_kodu ve şehir_adı bilgileri de yok olacak.

Bu durumda üçüncü normal forma ihtiyaç duyulur.

Üçüncü Normal Form

Birinci normal formdaki sorunlardan kurtulmak için nitelikler arasındaki kısmi işlevsel bağımlılıkları ortadan kaldırdık. İkinci normal formdaki sorunlardan kurtulmak için de nitelikler arasındaki geçişli işlevsel bağımlılıkları ortadan kaldırmamız gerekir.

Örneğin “şehir_adı ® şehir_kodu” işlevsel bağımlılığı geçişlidir. Bir anahtara bağlı olmayan bu bağımlılığı ayrı bir tabloya dönüştürerek üçüncü normal formu elde edebiliriz.

Şehirler Tablosu (şehir_kodu, şehir_adı)
Müşteriler Tablosu (müşteri_no, şehir_kodu )
Sipariş Tablosu (müşteri_no, gönderi_no, miktar)


Bu veritabanı tasarımı için artık daha fazla normalizasyon kuralı uygulamaya gerek yoktur. Oluşturduğumuz son hali ile kullanılabilir.

Boyce-Codd Normal formunu ve Dördüncü Normal Formu anlatmak için başka bir örnek üzerinden devam edelim.

Boyce-Codd Normal Formu

Boyce-Codd Normal formu için aşağıdaki Öğrenci tablosunu inceleyelim. Bu tablo, birinci normal forma uygun, bütün niteliklerin aldığı değerler atomik yapıda. İkinci ve üçüncü normal forma da uygun; alanlar arasında kısmi veya geçici bağımlılık yok. Bu üç normal formu da sağladığına göre sorun nedir?
  • Örneğin 456 numaralı öğrenci silinirse hem Biyoloji bölümü hem de danışman bilgisi yok olacak. Ya da bir öğrenci Matematik bölümüne kayıt olana kadar böyle bir bölüm olmayacak. Hadi varsa bu durumda ne yapmamız gerekir?

  • Boyce-Codd normal formu uygulandığında ÖğrNo, danışman alanı için belirleyici anahtar yapılır, danışman ise bölüme kısmi bağımlıdır. 
  • Tablolar aşağıdaki gibi oluşturulsaydı danışman ile bölüm ÖğrNo'ya tam işlevsel bağımlı olur. Bu tür bağımlılığa çok değerli bağımlılık denilmektedir (Dördüncü Normal forma uygun)
              Öğrenci_Bölüm Tablosu (Öğr_No, Bölüm)
              Öğrenci_Danışman Tablosu (Öğr_No, Danışman)


Dördüncü Normal Form

Boyce-Codd normal formdaki bir ilişkide de sorunlar alabilir. Çok değerli bağımlılığın söz konusu olduğu aşağıdaki duruma bakalım.
Burada bir öğrenci birden çok bölüme kayıt olabilmekte ve birden çok spor etkinliğine katılabilmektedir. Burada ÖğrNo ile Bölüm ve ÖğrNo ile Spor arasındaki ilişkiler birer işlevsel bağımlılık değil çok-değerli bağımlılıktır.

•      123 numaralı öğrencinin bir bölüme daha kayıt olması yada bir spor etkinliğine daha katılması durumunda tablolara birer kayıt daha ilave edilmelidir. Bunun gibi kayıt sorunlarını ortadan kaldırmak için ÖĞRENCİ ilişkisi ikiye ayrılarak dördüncü normal form oluşturulur.

 Siz Yapın

Aşağıdaki tablolar için normalizasyon kurallarını uygulayınız.


Verilen tablo Birinci Normal Formdadır (atomik değerler).
–     OKUL (Ö.No, Ö.Ad, Ö.Soyad, Ders_No, Ders_Adı, Vize, Final, H.No, H.Ad, H.Soyad)

İkinci Normal forma geçerken kısmi bağımlılıklar ortadan kaldırılır.
–     NOTLAR(Ö.No, Ders_No, Vize, Final)
–     ÖĞRENCİLER(Ö.No, Ö.Ad, Ö.Soyad)
–     DERSLER(Ders_No, Ders_Adı, H.No, H.Ad, H.Soyad)

 Üçüncü Normal forma geçerken geçişli bağımlılıklar ortadan kaldırılır.
–     NOTLAR(Ö.No, Ders_No, Vize, Final)
–     ÖĞRENCİLER(Ö.No, Ö.Ad, Ö.Soyad)
–     DERSLER(Ders_No, Ders_Adı, H.No)
–     HOCALAR(H.No, H.Ad, H.Soyad)


Verilen tablo Birinci Normal Formdadır (atomik değerler).
–     Urun_Parca (UrunNo, UrunAd, ParcaNo, ParcaAd, Miktar, UreticiNo, UreticiAd, UreticiSehir, UreticiTel) 

İkinci Normal forma geçerken kısmi bağımlılıklar ortadan kaldırılır.
–     Urun_Parca (UrunNo, ParcaNo, ParcaAd, Miktar)
–     Urunler (UrunNo, UrunAd, UreticiNo, UreticiAd, UreticiSehir, UreticiTel)

 Üçüncü Normal forma geçerken geçişli bağımlılıklar ortadan kaldırılır.
–     Urun_Parca (UrunNo, ParcaNo, ParcaAd, Miktar)
–     Urunler (UrunNo, UrunAd, UreticiNo)
–     Ureticiler (UreticiNo, UreticiAd, UreticiSehir, UreticiTel)


Verilen tablo Birinci Normal Formdadır (atomik değerler).
–      SIPARIS (SiparisNo, Tarih, UrunAd, UrunNo, Adet, MusNo, MusAd, MusSoyad) 

İkinci Normal forma geçerken kısmi bağımlılıklar ortadan kaldırılır.
–      SIPARIS_URUN (SiparisNo, UrunNo, Adet)
–      SIPARIS_MUSTERI (SiparisNo, Tarih, MusNo, MusAd, MusSoyad)
–      URUN (UrunNo, UrunAd) 

 Üçüncü Normal forma geçerken geçişli bağımlılıklar ortadan kaldırılır.
–      SIPARIS_URUN (SiparisNo, UrunNo, Adet)
–      SIPARIS_ MUSTERI (SiparisNo, Tarih, MusNo)
–      MUSTERILER (MusNo, MusAd, MusSoyad)
–      URUN (UrunNo, UrunAd)

Yorumlar

Bu blogdaki popüler yayınlar

Nesneye dayalı programlama

Çocuklarımızı Yapay Zekaya yönlendirmek o kadar da zor değil!

Veri ambarları, OLTP ve OLAP