Üçüncü normal şekil (Third Normal Form, 3NF)

Yazan : Şadi Evren ŞEKER

Bilgisayar bilimlerinde, veri tabanı teorisinde, bir veri tabanının daha verimli tutulması için geliştirilen şeklin ismidir. Bu şekil birinci ve ikinci normal şekillere göre daha başarılı çalışmayı hedefler.Unutulmamalıdır ki normal şekillerin hepsinde hedeflenen öncelikli performans, hafızanın daha verimli kullanılmasıdır. Hız için bazı durumlarda normal şekillerin dışına çıkılabilir.

Üçüncü normal şeklin, üzerine inşa edildiği mantık aslında matematikteki işlemlerde bulunan geçişlilik özelliğidir. Bu terim veritabanı teorisinde fonksiyonel bağımlılık (Functional Dependency) olarak isimlendirilmektedir ve kast edilen fonksiyonel bağımlılıkların geçişliliğidir.

Bu noktada hatırlanacağı üzere bir tablodaki aday anahtarın (candidate key) çıkarılması sırasında kritik olan husus, bu anahtarın tabloyu ifade etme kabiliyetidir. Şimdi aşağıdaki şekilde iki farklı anahtarın diğer anahtarları ifade etme kabiliyetlerini listeleyelim:

X → Y

Y → Z

Yukarıdaki bu gösterimlerin anlamı, X anahtarının Y’yi ve Y anahtarının da Z’yi ifade edebildiğidir. Diğer bir terimle fonksiyonel olarak bağlı olması durumudur.

Bu iki fonksiyonel bağlılık arasında geçişlilik özelliği (transitive property) kullanılırsa aslında

X → Z

Sonucuna da varılabilir.

İşte tam bu noktada üçüncü normal şekil devreye girer ve der ki bir veri tabanının üçüncü normal şekilde olması için veritabanında bulunan anahtarların birbirine fonksiyonel olarak bağlı olması gerekir. Bu bağlılık ya doğrudan ya da geçişlilik özelliği sayesinde olmalıdır.

Üçüncü normal şeklin diğer bir kuralı da bu şekilde olan veritabanlarının aynı zamanda ikinci normal şekilde (second normal form) olma zorunluluğudur.

Kısaca 3. normal şekildeki bir veritabanı:

  1. Anahtarlarının birbirine fonksiyonel bağlı olduğu (doğrudan veya geçişlilik özelliği ile) ve Geçişli bağlılığın bulunmadı (bütün bağlantıların non-transitive olduğu tablolara bölündüğü)
  2. Veri tabanındaki ilişkilerin 2. normal şekilde olduğu

veri tabanıdır diye tanımlanabilir.

Örneğin aşağıdaki ikinci normal şekilde bulunan tabloyu ele alalım:

Öğrenci Adı Doğum Tarihi Dersin Adı Dersin Kredisi
Ali 1980 JAVA 3
Rana 2007 Matematik 4
Elif 1980 Biyoloji 3
Veli 1979 JAVA 3

Yukarıdaki bu tablo ikinci normal şekildedir ancak üçüncü normal şekle uymamaktadır. Öncelikle bu tabloda, bütün tabloyu ifade etmeye yarayan aday anahtar olarak “Öğrenci Adı” ve “Doğum Tarihi” kolonlarının birleşimini düşünebiliriz. Bu aday anahtar’a fonksiyonel olarak bağlı olan “Dersin Adı” ve  “Dersin Kredisi” kolonları da kendi aralarında fonksiyonel olarak bağlıdırlar. Yani tablomuzdaki fonksiyonel bağımlılıkları aşağıdaki şekilde ifade etmek mümkündür:

{Öğrenci Adı, Doğum Tarihi} → Dersin Adı

Dersin Adı → Dersin Kredisi

Yukarıdaki bu bağımlılıklardan yola çıkarak {Öğrenci Adı, Doğum Tarihi} aday anahtarının Dersin kredisini ifade edebileceğini söyleyebiliriz. Ancak bu durumda Dersin Adı ve Dersin Kredisi kolonları arasında bir veri bütünlüğü sorunu doğmaktadır.

Dolayısıyla yukarıdaki fonksiyonel bağlılıkları çıkardıktan sonra aşağıdaki şekilde iki tabloya dönüştürmek veri tabanımızı üçüncü normal şekle getirecektir:

Öğrenci Adı Doğum Tarihi Dersin Adı
Ali 1980 JAVA
Rana 2007 Matematik
Elif 1980 Biyoloji
Veli 1979 JAVA

Ve ikinci bir tabloda da:

Dersin Adı Dersin Kredisi
JAVA 3
Matematik 4
Biyoloji 3

Yorumlar

  1. Şadi Evren ŞEKER Article Author

    En kısa cevapla, veri tabanı tasarımında bir ilişkisel veri tabanının normalleştirilmesinde (normalisation) kullanılan standardın ismidir.

    Bu sayede, veri tabanında gereksiz bilgi tekrarları engellenecek, veri tabanındaki veri miktarı sonsuza giderken verinin daha verimli tutulması sağlanacaktır.

    Örneğin yukarıda verilen örnekte, dersin kredisinin ayrı bir tabloda tutulması sayesinde JAVA dersinin kredisi sadece 1 kere veri tabanında tutulmaktayken, 3. normal şekle getirilmemiş bir önceki örnekte bu bilgi 2 kere tekrarlanmaktadır.

  2. engin

    merhaba yazı için teşekkür ederim. o kadar çabalasam da 2. kural ile 3. kural arasındaki farkı bir türlü anlayamadım 🙂 daha sade bir örnek verilebilir mi bu konuda.

  3. Şadi Evren ŞEKER Article Author

    Çok basitçe anlatıyorum. Bir tabloda gereksiz yere tekrar eden veriler varsa, bunların ikinci bir tabloya alınmasını hedefler. Örneğin yukarıdaki örnekte dersler, öğrenciler ile birlikte tek tabloda durmakta ve her öğrenci için aldığı ders tekrar etmekteydi. Bu tekrar tek bir kolona kadar kabul edilebilir ancak iki veya daha fazla kolon, gereksiz yere tekrar ediyorsa bu tekrarların ayrılması gerekir.

    Bu tekrarları bulmak için functional dependency (fonksiyonel bağlılık) ismini verdiğimiz özelliklerden faydalanıyoruz. Bu özellikler ikinci normal formda bulunmaz. Kısacası 2. kural ile 3. kural arasındaki fark bu fonksiyonel bağımlılıklardır denilebilir.

    Fonksiyonel bağımlılıkları çıkardıktan sonra ayrılması gereken kolonlar zaten anlaşılır. Yukarıdaki örnekte öğrenci adı ve doğum tarihi, tablonun anahtar alanlarıdır. Bu alanlar bütün tabloyu eşsiz olarak belirler (uniquely identify). Ayrıca ders ile dersin kredisi arasında da fonksiyonel bağlantı bulunur. Yani ders adı, ders kredisini belirlemede kullanılabilir.

    Sonuç olarak ders adı ve kredisi ayrı bir tabloda durabilir ve öğrenci adı ve doğum tarihinden bu ikinci oluşacak tabloya bir bağlantı tutulması yeterlidir. Bağlantı için ders adı kullanılmıştır.

  4. engin

    Evren bey, sabaha karşı bize yardım etmek adına buraya gelip de soruma cevap yazdığınız için çok çok teşekkür ederim. verdiğiniz cevapla yazdığınız yazıyı birleştirip tekrar okuyunca güzel bir şekilde anladım. çok çok sağolun. Başarılar diliyorum. tekrar teşekkürler.

  5. nilay

    merhaba, tüm yazılarınız için çok teşekkürler öncelikle. Fakat 2.NF ve 3. NF için verdiğiniz örnekler nerdeyse birbirinin aynı. 2.NF'de verilen örnekte kısım-dahili tel ayrılıyor. 3.NF'de ise dersin adı ve kredisi. Yani neredeyse aynılar. aralarındaki farkı tam çözemedim. Yukarıda verdiğiniz ilk hal için 2. NF'ye uyuyor demişsiniz ama mesela 2.NF öreneğinde ayırmışsınız? açıklarsanız çok sevinirim. Teşekkürler

  6. Şadi Evren ŞEKER Article Author

    Bakın, 3NF olan bütün veri tabanı yapıları 2NF şartını da sağlar. Aradaki fark 3NF olması için ilave şartlar bulunmasıdır. Bunu ise tablo yapılarından çok tablodaki anahtarlarda aramanız gerekir (yorumunuzdan anladığım kadarıyla yanlış yere bakıyorsunuz). Yani fonksiyonel bağımlılık (functional dependency) 3NF için özel bir durumdur ve 2NF'te yoktur.
    Aradaki farklı şöyle tanımlayabiliriz:
    2NF için bulunan aday anahtar (candidate key) şayet super anahtarın (super key) bir alt kümesi değilse 2NF şartı sağlanır. Yani sadece bu özel duruma bakar.
    Buna karşılık 3NF, aday anahtarın bir super anahtar (super key) olması ile ilgilienir.

    Yani 2NF aslında 3NF'in özel bir halidir (ön koşul gibi) ve gerçekte çok kullanışlı değildir. 1NF'ten 3NF'e geçiş olarak düşünebilirsiniz.

    Bir de belki aşağıdaki yazının faydası olur:

    http://www.bilgisayarkavramlari.com/2009/01/16/aday-anahtar-candidate-key/

    Başarılar

  7. Şadi Evren ŞEKERŞadi Evren ŞEKER

    2NF'de iki kere java yazmasını engelleyen bir kural yoktur. Yukarıdaki tabloda, her kolon (veya özellik) tablonun tek bir kolonluk alt kümelerini oluşturur. Birden fazla kolon bir alt küme oluşturamaz. Dolayısıyla bu tablo için iki kere java yazması, 3 kere 3 yazması veya 2 kere 1980 yazması 2NF açısından sorun teşkil etmez.

    Bağlantısını verdiğiniz yazımı da tekrar gözden geçirdim ve bununla çelişen bir durum göremedim. Gözümden kaçan bir yer varsa lütfen belirtin düzelteyim.

  8. Gürkan

    " Bu tekrar tek bir kolona kadar kabul edilebilir ancak iki veya daha fazla kolon, gereksiz yere tekrar ediyorsa bu tekrarların ayrılması gerekir." Siz yazmışsınız yukarıda, Hocam bu 2NF kuralı değil mi?
    Ali 1980 JAVA 3
    Rana 2007 Matematik 4
    Elif 1980 Biyoloji 3
    Veli 1979 JAVA 3 Bu tablo 2 NF'ye uyuyor mu? JAVA ve 3ler iki defa tekrarlanmış.

  9. Gürkan

    "ikinci normal formun ilk normal form üzerinde tek kuralı vardır. O da aday anahtar (candidate key) olarak tanımlanabilecek bir anahtara bütün diğer kolonların tam bağlı olması ve herhangi bir alt kümesine bağlı olmamasıdır."
    Ali-----1980---JAVA---------3
    Rana-2007----Matematik--4
    Elif----1980----Biyoloji------3
    Veli---1979----JAVA---------3
    Burada Ders ya da dersin kredisi aday anahtar(isim + yıl)'a tam bağımlı değil ki Dersin kredisi Derse tam bağımlı (isim+yıl)'a değil 2.NF uyması için şöyle olması lazım, iki ayrı tablo tanımlamalıyız:

    İsim --Doğum Tarihi --Ders
    Ders-- Dersin Kredisi

    1. Şadi Evren ŞEKERŞadi Evren ŞEKER

      Evet yazılarda sorun yok. Farkı sanırım şu şekilde görebilirsiniz. Örneğin tablo aşağıdaki şekilde olsaydı:
      Ali-----1980---JAVA---------3
      Rana-2007----Matematik--4
      Elif----1980----Biyoloji------2
      Veli---1979----JAVA---------3

      Ve ayrıca her dersin kredisi diğer derslerden farklı olsaydı, bu durumda (ders,kredi) ikilisi hem ders hem de kredi ile tanımlanabilen (dersin isminin veya kredisinin bir anahtar olduğu) ikili haline dönüşecekti. Bu durumda da tablo 2nf değildir diyebilecektik. Ancak yukarıdaki örnekte kredi, ders ismine geçişli bağlılık gösterir (transitive).

      Yani bu yeni durumda ders isminin tekrarı kredinin tekrarını gereksiz kılarken, kredinin tekrarı da ders isminin tekrarını gereksiz kılacaktı. Oysaki yazıda bulunan örnekte ders isminin tekrarı kredinin tekrarını gereksiz kılarken (3nf için sorun olmakla birlikte) kredinin tekrarı ders isminin tekrarını gereksiz kılmamaktadır (2nf için sorun oluşturmamaktadır). Örneğin sadece kredileri tabloda tutarak derslere veya sadece dersleri tutarak kredilerine ulaşabilecektik. Bu durumda da 2nf değildir diyebilecektik.

      Ancak 2nf olduğu söylenen tabloda böyle bir durum yok. Tablo yukarıdaki haliyle 2nf özelliğindedir. Tekrar olacak ama 2 kere java yazması 3 kere 3 yazması veya 2 kere 1980 yazmasının bu örnek için 2nf ile ilgili bir problem teşkil etmediğini söyleyebiliriz.

      Yine durumu farklı bir şekilde görmek isterseniz şu açıdan da bakabilirsiniz. Ders isimleri (örneğin java) isim ve doğum tarihi ikilisine (Anahtara) doğrudan bağlı iken, kredilerin böyle bir doğrudan bağı yoktur (görmek için tablodan ders isimlerini silin ve aşağıdaki halini düşünün):

      Ali-----1980---3
      Rana-2007----4
      Elif----1980----2
      Veli---1979----3

      Bununla birlikte kredilerin ders isimlerine doğrudan bağlılığı bulunmakta olup, kredilerin anahtara (yani isim ve doğum tarihi ikilisine) ders isimleri üzerinden geçişli bir bağlantısı bulunmaktadır. Bu durum 2nf için sorun olmazken 3nf için sorun olmaktadır.

Bir Cevap Yazın

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


altı − 6 =