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.