4NF Dördüncü Normal Şekil (Fourth Normal Form)

Yazan: Şadi Evren ŞEKER

Bu yazının amacı, veri tabanı normalleştirme şekillerinden birisi olan dördüncü normal şekli (fourth normal form, 4NF) izah etmektir.

Boyce Codd Normal Form (BCNF) olarak bilinen normal şekilden bir sonraki aşama olarak görülebilir. Dördüncğ normal şekle kadar olan en gelişmiş kaygı, fonksiyonel bağımlılıklardır (functional dependency). Ancak dördüncü normal şekil ile birlikte çoklu değer bağımlılığı (multi valued dependency) kavramı devreye girer. Burada örneğin X –>-> Y şeklindeki bir gösterim, X’in ya bir üst anahtar (super key) olduğu anlamına gelir ki, bu da X’in Y’nin bir üst kümesi (kapsayan kümesi, super set) ya da X’in bir aday anahtar (candidate key) olması anlamına gelmektedir.

4NF kavramının detaylarına girmeden önce bu çoklu değer bağımlılığı (multi valued dependency) kavramını açıklamamız gerekir.

Çoklu Değer Bağımlılığı (Multi Valued Dependency , MVD)

Şayet herhangi bir kolon (örneğin X olsun), aynı kalmak şartıyla, ikinci bir kolondaki (örneğin Y olsun) veriler değişiyorsa, bu durumda X’in Y üzerinde çoklu değerle ifadesi söz konusudur ve X–>->Y şeklinde gösterilen çoklu değer bağımlılığı vardır denilebilir.

Bu kavram ilk başlarda fonksiyonel bağımlılık (functional dependency) ile karıştırılabilir. Aslında fonskiyonel bağımlılık da çoklu değer bağımlılığının özel bir halidir.

Fonksiyonel bağımlılıkta X–>Y şeklinde gösterim, her x tarafından karşılanan tam olarak bir tane y olması durumudur, yani her x için karşılık gelen bir y bulunuyor bu durumda X kolonundaki bütün x satırları, Y kolonundaki bütün y satırları tarafından karşılanıyor, diğer bir deyişle, X kolonundaki değerler değiştikçe Y kolonunda da değişim oluyor demektir.

Çoklu değer bağımlılığı bunun bir seviye ilerisine giderek, fonksiyonel bağımlılık olmadığı durumlarda da birden fazla veri ile ifade ediliyorsa bu durumu tespit için kullanılır.

4NF için bir Örnek

Çoklu değer bağımlılığını ve 4NF nasıl çalıştığını bir örnek üzerinden gösterelim.

Örneğin işletmede çalışanlarımızın mezuniyet bilgisini ve yabancı dillerini tutmak istiyoruz. Örnek bir tablo aşağıdaki kolon başlıklarından oluşabilir:

Çalışan, Mezuniyet, Yabancı dil

Yukarıdaki bu tanım, ve tablo bir problemi beraberinde getiriyor. Örneğin birden fazla mezuniyeti olan kişiler (y.lisans yapmış veya iki üniversite bitirmiş vs.) için yukarıdaki her çalışan ve yabancı dil bilgisi tekrar edeceği gibi iki yabancı dil bilen her çalışan için de çalışan ve mezuniyet bilgisi tekrar edecektir.

Bu durumu tablomuza örnek veriler girerek göstermeye çalışalım:

Çalışan Mezuniyet Yabancı Dil
Ali Yeditepe Ünv. Bilgisayar Mühendisliği İngilizce
Ali Yeditepe Ünv. Bilgisayar Mühendisliği Almanca
Ali MIT, Bilg. Müh. Y. Lisans İngilizce
Ali MIT, Bilg. Müh. Y. Lisans Almanca

Yukarıda, tek bir çalışan için gösterilen durum, diğer çalışanlar eklendikçe de karşılaşılacak bir problemdir. Yani sistemde herkesin tek dili olsa veya tek mezuniyeti olsa sorun olmayacak. Ancak aynı anda birden fazla dil veya birden fazla mezuniyet olması durumunda yukarıdaki gibi satır tekrarları oluşmaktadır. Örneğin Ali, Rusça öğrenmiş olsun bu durumda bütün mezuniyet bilgileri tekrarlanarak aşağıdaki şekli alacaktır:

Çalışan Mezuniyet Yabancı Dil
Ali Yeditepe Ünv. Bilgisayar Mühendisliği İngilizce
Ali Yeditepe Ünv. Bilgisayar Mühendisliği Almanca
Ali MIT, Bilg. Müh. Y. Lisans İngilizce
Ali MIT, Bilg. Müh. Y. Lisans Almanca
Ali Yeditepe Ünv. Bilgisayar Mühendisliği Rusça
Ali MIT, Bilg. Müh. Y. Lisans Rusça

Görüldüğü üzere satır tekrarları dil için oluşmaktadır. Geri dönelim ve diyelim ki Ali ikinci bir yüksek lisans yaptı. Bu durumda tablonun ilk hali (Rusça öğrenmeden önceki hali) aşağıdaki gibi olacaktı:

Çalışan Mezuniyet Yabancı Dil
Ali Yeditepe Ünv. Bilgisayar Mühendisliği İngilizce
Ali Yeditepe Ünv. Bilgisayar Mühendisliği Almanca
Ali MIT, Bilg. Müh. Y. Lisans İngilizce
Ali MIT, Bilg. Müh. Y. Lisans Almanca
Ali Harvard, Hukuk Y.Lisans İngilizce
Ali Harvard, Hukuk Y.Lisans Almanca

Görüldüğü üzere tabloya yeni bir mezuniyet VEYA yabancı dil eklenmesi halinde, bütün satırların kopyalanması söz konusudur.

Tablonun ilk hali (veya sonraki halleri için de geçerli) ele alınacak olursa, fonksiyonel bağımlılık (functional dependency) açısından bir sorun görülmemektedir.

Yani çalışan ne mezuniyeti ne yabancı dildeki değişimleri ifade edemez. Benzer durum mezuniyet ve yabancı dil için de iki yönlü geçerlidir.

Yukarıdaki tablolara tek başına bakıldığında, belki yabancı dil veya mezuniyet, çalışan bilgisini ifade etmek için yeterlidir gibi bir görüntü çıkabilir ancak bu durumun gerçek olmadığı, aşağıdaki gibi bir tabloda net olarak görülmektedir.

Çalışan Mezuniyet Yabancı Dil
Ali Yeditepe Ünv. Bilgisayar Mühendisliği İngilizce
Ali Yeditepe Ünv. Bilgisayar Mühendisliği Almanca
Ali MIT, Bilg. Müh. Y. Lisans İngilizce
Ali MIT, Bilg. Müh. Y. Lisans Almanca
Veli Boğaziçin Ünv. Bilgisayar Mühendisliği İngilizce
Veli Yeditepe Ünv. MBA İngilizce
Veli Boğaziçin Ünv. Bilgisayar Mühendisliği Rusça
Veli Yeditepe Ünv. MBA Rusça

Yukarıdaki bu durumda iki tane çoklu değer bağımlılığından bahsedilebilir. Görüldüğü üzere, aynı mezuniyet bilgisi için birden fazla çalışan veya aynı yabancı dil için birden fazla çalışan olabilmektedir.

Aslında tabloda tutulan bilgiler, {Çalışan, Mezuniyet} kümesi ile {Çalışan, Yabancı dil} kümelerinin çarpraz çarpımıdır (cross product). Bu durumu yakalamanın tek yolu da çoklu değer bağımlılıklarını analiz etmektir.

Bağımsızlık (Independence)

Örneği yukarıdai şekle getirdikten sonra, hemen belirtmek gerekir ki dördüncü normal şekil için yukarıda anlatılanların hepsi doğru olmakla birlikte, sık yapılan bir hata da bağımsızlık kavramının yanlış uygulanmasıdır. Örneğin yukarıdaki tablonun ilk halini ele alalım ve aşağıdaki şekilde olsun:

Çalışan Mezuniyet Yabancı Dil
Ali Yeditepe Ünv. Bilgisayar Mühendisliği İngilizce
Ali Dil kursu İngilizce
Ali Dil kursu Almanca

Örneğin yukarıdaki şekilde bir öncekinden farklı olarak çalışanın okuduğu okul / program için okuduğu dili tutuyor olalım. Yani bir önceki tabloda çalışanın bildiği yabancı dilleri ve mezuniyetlerini tutuyorduk, şimdi çalışanın mezun olduğu programdaki yabancı dilini tutuyoruz.

Dolayısıyla artık 4NF açısından bir problem olmaz. Yani {Çalışan, Mezuniyet} ve {Çalışan, Yabancı dil} ikilileri artık bağımsız ikililerdir (independent) ve birisine eklenen satır, diğerindeki bilgilerin tekrarını gerektirmez.

Normalleştirme

Buraya kadar, neyin problem olup neyin olmadığından bahsettik, şimdi problemi bulduktan ve çoklu değer bağımlılıklarını (multi valued dependency) çıkardıktan sonra normalleştirmenin nasıl yapıldığını görelim (ki aslında geriye pek de bir iş kalmıyor):

Yukarıdaki tablonun ilk halini ele alalım (hatırlatmak için burada bir kere daha veriyorum)

Çalışan Mezuniyet Yabancı Dil
Ali Yeditepe Ünv. Bilgisayar Mühendisliği İngilizce
Ali Yeditepe Ünv. Bilgisayar Mühendisliği Almanca
Ali MIT, Bilg. Müh. Y. Lisans İngilizce
Ali MIT, Bilg. Müh. Y. Lisans Almanca

Şimdi bu tabloda bulduğumuz çoklu değer bağımlılıklarını yazarsak :

Çalışan –>-> Mezuniyet

Çalışan –>-> Yabancı Dil

Şeklinde iki bağımlılık ortaya çıkar. Bunları kullanarak normalleştirme yaparsak iki ayrı tablomuz olur:

Çalışan Mezuniyet
Ali Yeditepe Ünv. Bilgisayar Mühendisliği
Ali MIT, Bilg. Müh. Y. Lisans
Çalışan Yabancı Dil
Ali İngilizce
Ali Almanca

Yani, çalışanın yabancı dilleri ve mezuniyetleri ayrı iki tabloda tutulmuştur. Bu durumda yeni bir mezuniyet eklenmesi yabancı dil tablosunda bir işlemi gerektirmezken, tersi durumda yeni bir yabancı dil eklendiğinde mezuniyet tablosunda bir değişim olmaz ve aynı çalışan için bütün mezuniyet ve yabancı dil bilgilerine erişilebilir.

Örnek:

Konunun daha iyi anlaşılması için tamamen farklı bir örnek çözelim. Problemimizi biraz daha geriden alıp, üçüncü normal şekilde olayan bir tabloyu normalleştirme ile işe başlayalım ki iki normalleştirme arasındaki fark da anlaşılsın. Örneğin aşağıdaki tabloyu normalleştirmemiz isteniyor olsun:

Ders Hoca İşe Başlama Kitap Basım Yılı
CSE340 Şadi 2002 C Programlama 2007
CSE340 Şadi 2002 İşletim Sis. 2007
CSE340 Ali 1996 C Programlama 2007
CSE340 Ali 1996 İşletim Sis. 2007
CSE301 Şadi 2002 C Programlama 2007
CSE301 Şadi 2002 Sistem Prog. 2007
CSE301 Şadi 2002 Ağ Programlama 2005
CSE301 Veli 1993 C Programlama 2007
CSE301 Veli 1993 Sistem Prog. 2007
CSE301 Veli 1993 Ağ Programlama 2005

Öncelikle yukarıdaki tablomuz 3. normal şekilde değildir. Hoca ile işe başlama tarihi arasında iki yönlü fonksiyonel bağımlılık (functional dependency) olduğu gibi kitap ile basım yılı için de aynı durum söz konusudur. Ayrıca kitap ve ders, hoca ve ders ve hoca ve kitap kolonları arasında da çoktan çoka (many to many) ilişkiler söz konusudur.

İşe tabloyu 3. normal şekle geçirerek başlayalım. Dikkat edileceği üzere hoca ile ders arasında sayısallık açısından (cardinality) çoktan çoka (many to many) ilişki bulunmaktadır. Bu iki tabloyu ayırarak işe başlayabiliriz:

Hoca İşe Başlama
Şadi 2002
Ali 1996
Veli 1993

Hoca tablosu için görüldüğü üzere 3 kayıt yeterlidir. Şimdi derslere bakalım:

Ders Kitap Basım Yılı
CSE340 C Programlama 2007
CSE340 İşletim Sis. 2007
CSE301 C Programlama 2007
CSE301 Sistem Prog. 2007
CSE301 Ağ Programlama 2005

Görüldüğü üzere dersler ve okutulan kitapları ayrı bir tabloya aldığımızda 5 kayıt yeterli oluyor. Geriye dersler ve hocalar arasındaki ilişki tablosunu (relation table) tutmak kalıyor ki bu da aşağıdaki şekilde oluşturulabilir:

Ders Hoca
CSE340 Şadi
CSE340 Ali
CSE301 Şadi
CSE301 Veli

Burada da hangi hocanın hangi dersi verdiğini tutmuş olduk. Dolayısıyla veri tabanını iki ayrı parçaya böldük ve üçüncü normal şekle soktuk.

Şu haliyle ders ve kitapların tutulduğu tabloda da sorunumuz bulunuyor. Bu tabloları üçüncü normal şekilde normalleştirmeyi denersek :

Ders Kitap
CSE340 C Programlama
CSE340 İşletim Sis.
CSE301 C Programlama
CSE301 Sistem Prog.
CSE301 Ağ Programlama

Görüldüğü gibi hiçbir satırını silemediğimiz bir durum ile karşılaşıyoruz. Ancak elbette kitap tablosu biraz kısalıyor:

Kitap Basım Yılı
C Programlama 2007
İşletim Sis. 2007
Sistem Prog. 2007
Ağ Programlama 2005

Normalleştirmeyi başarılı bir şekilde tamamlamış oluruz.

Şimdi bütün problemi baştan ele alıp farklı bir strateji izleyelim. Tablonun orjinali aşağıdaki şekildedir:

Ders Hoca İşe Başlama Kitap Basım Yılı
CSE340 Şadi 2002 C Programlama 2007
CSE340 Şadi 2002 İşletim Sis. 2007
CSE340 Ali 1996 C Programlama 2007
CSE340 Ali 1996 İşletim Sis. 2007
CSE301 Şadi 2002 C Programlama 2007
CSE301 Şadi 2002 Sistem Prog. 2007
CSE301 Şadi 2002 Ağ Programlama 2005
CSE301 Veli 1993 C Programlama 2007
CSE301 Veli 1993 Sistem Prog. 2007
CSE301 Veli 1993 Ağ Programlama 2005

Hoca ile işe başlama arasında fonksiyonel bağımlılık (functional dependency) olduğunu biliyorduk. Bu sefer sadece bu bilgiyi ayırarak bir yol izliyoruz:

Ders Hoca Kitap Basım Yılı
CSE340 Şadi C Programlama 2007
CSE340 Şadi İşletim Sis. 2007
CSE340 Ali C Programlama 2007
CSE340 Ali İşletim Sis. 2007
CSE301 Şadi C Programlama 2007
CSE301 Şadi Sistem Prog. 2007
CSE301 Şadi Ağ Programlama 2005
CSE301 Veli C Programlama 2007
CSE301 Veli Sistem Prog. 2007
CSE301 Veli Ağ Programlama 2005
Hoca İşe Başlama
Şadi 2002
Ali 1996
Veli 1993

Yukarıdaki şekilde iki ayrı tablo elde ettik. Şimdi sırada kitap ile basım yılı arasındaki fonksiyonel bağımlılık işlenirse aşağıdaki şekilde iki tablo elde ederiz (yukarıdaki hoca ve işe başlama tablosunu tekrar etmiyorum o tablo zaten artık bitti)

Ders Hoca Kitap
CSE340 Şadi C Programlama
CSE340 Şadi İşletim Sis.
CSE340 Ali C Programlama
CSE340 Ali İşletim Sis.
CSE301 Şadi C Programlama
CSE301 Şadi Sistem Prog.
CSE301 Şadi Ağ Programlama
CSE301 Veli C Programlama
CSE301 Veli Sistem Prog.
CSE301 Veli Ağ Programlama
Kitap Basım Yılı
C Programlama 2007
İşletim Sis. 2007
Sistem Prog. 2007
Ağ Programlama 2005

Yukarıdaki kitap ve basım yılı tablomuz da nihayi halini aldı gelelim yukarıdaki ilk tablo olan ders, hoca ve kitap tablosuna. Bu tablo dördüncü normal şekilde değildir. Sebebi derse eklenen her kitap için hocanın tekrar etmesi ve her hoca için kitabın tekrar etmesidir.

Ders –>-> Hoca

Ders –>-> Kitap

şeklinde iki adet çoklu değer bağımlılığı (multi valued dependency) bulunmaktadır. Bunları işlersek aşağıdaki şekilde ayırmamız gerekir:

Ders Kitap
CSE340 C Programlama
CSE340 İşletim Sis.
CSE301 C Programlama
CSE301 Sistem Prog.
CSE301 Ağ Programlama
Ders Hoca
CSE340 Şadi
CSE340 Ali
CSE301 Şadi
CSE301 Veli

Görüldüğü gibi aynı sonuca ulaştık. İkinci şekilde çözmemin tek sebebi dördüncü normal şekille karşılaştığımızı göstermekti. Yani şayet dördüncü normal şekli bilmiyor veya kullanmıyor olsaydık o zaman sadece üçüncü normal şekil kullanarak iki ayrı sırada tablomuzu normalleştirecek ama yine de farklı sonuçlar elde edecektik. Oysaki dördüncü normal şekli kullanarak aynı sonuca ulaşmış olduk. Bu durum, dördüncü normal şeklin ne kadar önemli olduğunu ve bilinmemesi veya kullanılmaması halinde ne kadar farklı sonuçlara ulaşılabileceğini göstermektedir.

 

Bir cevap yazın

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