ilk normal şekil (First Normal Form) 1NF

Yazan : Şadi Evren ŞEKER

Veri tabanı teorisinde geçen ve ilişkisel bir veri tabanının hafızayı daha verimli kullanması (daha az yer kaplaması) için geliştirilen normal şekillerden en ilkelidir.

Bir veri tabanı tasarlanırken normal formda olması göz önüne alınabilir veya daha sonradan normalleştirilebilir (nomalization). Bu sayede veri tabanının daha az yer kaplaması sağlanmış olur. Ancak bazı durumlarda yerden fedakarlık yapılarak hız ön plana çıkar. Bu durumda normalleştirilmiş bir veritabanının bozulması (denormalization) gerekir.

ilk normal şekilde iki temel kural vardır:

  1. Veri tabanında bulunan tabloların ilişki (bağlantı, join) kurulabilir şekilde tasarlanması.
  2. Tablolarda veri tekrarı (repeating groups) bulunmaması.

Şayet bir veri tabanı yukarıdaki şartları sağlayan bir haldeyse bu veritabanına ilk normal şekilde denilir.

Örneğin telefon defterinin tutulduğu bir tablo yapılmak istensin ve defterimizde isim, soyisim ve telefon numarası kolonları bulunsun. Bu durumda örnek bir tablo aşağıdaki şekilde olabilir:

İsim Soyisim Telefon No
Şadi Evren ŞEKER 02163023042
Ali Yıldız 02165780000
Ahmet Demir 02164890000

Yukarıdaki tabloda herşey normal görülebilir çünkü yeni birisi eklenince tablonun sonuna ilave edilecek birisi arandığında isim veya soy isim alanlarında arama yapılıp bulunan numara döndürülecek ve silme işlemi arama sonucunda sağlanacaktır. Ancak problem olan durum aynı kişiye ait ikinci bir telefon eklenemesidir.

Örneğin “Ali Yıldız”‘ın ikinci bir telefonu daha olsun ve rehberimizde bu ikinci kaydı tutmak isteyelim. Bu durumda aşağıdaki tablo alternatifi ile karşılaşırız:

İsim Soyisim Telefon No
Şadi Evren ŞEKER 02163023042
Ali Yıldız 02165780000
Ahmet Demir 02164890000
Ali Yıldız 02165780001

Yukarıdaki tabloda yeni bir kayıt eklenmiş ve ikinci telefon numarası kaydedilmiştir. Ancak bu durum bir problemdir çünkü aynı bilgi tekrar edilmiştir. Yani isim alanında aynı kişiyi ifade eden “Ali” ve soy isim alanında aynı kişiyi ifade eden “Yıldız” bilgisi tekrar edilmiştir.

Bu durumun çözümü olarak tek isim ve soy isim kaydının karşısında iki telefon numarası tutulması gerekir.

Bir çözüm alternatifi olarak aşağıdaki şekilde bir tablo düşünülebilir:

İsim Soyisim Telefon No TelefonNo2
Şadi Evren ŞEKER 02163023042
Ali Yıldız 02165780000 02165780001
Ahmet Demir 02164890000

Yukarıdaki tabloda yeni bir kolon eklenmiştir ve bu kolonda ikinci telefon numarası tutulmaktadır. Burada hemen farkedilebileceğimiz bir problem 3. veya 4. telefon numaralarının bir problem olmaya devam ettiğidir. Diğer bir problem ise tek telefonu olan kişiler için fazladan boş bir alan hafızada işgal edilmektedir.

Problemin çözümü yukarıdaki tablo yapısını 1NF uygun olarak ikiye bölmektir:

Kişiler Tablosu:

No İsim Soyisim
1 Şadi Evren ŞEKER
2 Ali Yıldız
3 Ahmet Demir

Telefonlar tablosu:

No Telefon No
1 02163023042
2 02165780000
3 02164890000
2 02165780001

Yukarıdaki iki tablo daha öncedentek tabloda tutulmaya çalışılan verileri tutmaktadır. Bu iki tablo arasında bir ilişki (join) kurmak ve iki tablodan bağlantılı olarak bilgi almak mümkündür. Ayrıca yukarıda saydığımız, boş değer bulunması (örneğin 2. telefonu bulunmayan kişiler için boş alan tutulması, null value) veya kayıt tekrarı problemleri çözülmüştür ve yazının başında belirttiğimiz ilişki kurulabilir tablolar elde edilmiştir.

Dikkat edileceği üzere iki ayrı tabloda veriyi tutmak ve arada ilişki kurmak tek tabloda tutmaya göre daha yavaş çalışabilir. Bu durumda normal şekil bozularak (denormalization) tek tabloya indirilmesi gerekebilir.

Yorumlar

  1. Şadi Evren ŞEKER Article Author

    🙂 Birinci normal şekil (first normal form) en basit normal şekildir. Hemen hemen hiç kural yoktur. Sadece tekrarlı grup olmaması gerekir bir de ilişki kurulmaya hazır.

    Yukarıdaki yazıda detaylıca anlattım ama çok daha basit anlatmak gerekirse bir tabloda iki tane aynı satır olmamalıdır.

    Örneğin öğrenci no ve isim olan bir tablo için aşağıdaki durum, 1NF için uygun değildir:

    No    İsim
    3212  Ali Demir
    4324  Veli Yılmaz
    4324  Veli Yılmaz
    

    Yukarıdaki tablonun olmama sebebi aynı satırın iki kere tekrarlanmış olmasıdır. Çözüm bu tekrarlı satırı kaldırmaktır. Yani her veriden bir kopya bulunacak.

    Gelelim ikinci şartımız olan ilişki kurulabilir tablolar olmasına.

    Bu şartta bize diyor ki, veriler arttıkça kolon sayısını arttıramazsınız. Böyle durumlarda ikinci bir tablo ekleyin.

    Örneğin öğrencilerin aldığı dersler var diyelim. Yukarıdaki tabloya ilave olarak bir kolonda ders tutalım:

    No    İsim          Ders
    3212  Ali Demir     Bilgisayara Giriş
    4324  Veli Yılmaz   Veri Yapıları
    

    Yukarıdaki haliyle herhangi bir problem bulunmayan bu tabloya ikinci bir ders eklediğimizde problem ortaya çıkacak. Tablo tanımlarında kolonlar esnek değildir. Yani tablo tek boyutlu olarak büyür. Bu durumda örneğin Ali Demir, ikinci bir ders alıyorsa, yukarıdaki tasarımda problem olacaktır.

    Çözüm nedir? Çözüm ikinci bir ders tablosu tutup arada ilişki kurmaktır.
    Öğrenci tablosu:

    No    İsim        
    3212  Ali Demir    
    4324  Veli Yılmaz  
    

    Ders tablosu:

    Ders              Öğrenci
    Veri Yapıları     4324
    Bilgisayara Giriş 3212
    Lojik Devre       4324
    Veri Yapıları     3212
    

    Yukarıda görüldüğü üzere, ikinci tabloda her dersi kimin aldığı tutulmuştur. Bu yapıda, daha önce yaşanan ve bir öğrencinin birden fazla ders alması problemi çözülmüştür.
    Yukarıdaki örnek 1NF olarak doğru olmasına karşılık 2NF ve 3NF veya BCNF şartlarını sağlamaz. Örneğin 2NF için gereken anahtar bulunmamış fonksiyonel bağlılıklar belirlenmemiş ve buna göre normalleştirme (normalisation) yapılmamıştır. Sadece bu konuyu anlayamadığınızı belirttiğiniz için bu konuyu açıklayan bir örnek vermeye çalıştım.

    başarılar

  2. Murat Gök

    Şadi Bey, emeğiniz için teşekkürler. Bilgilendirici bir yazı olmuş. Fakat kaynaklarda (Ünal Yarımağan-Veritabanı Sistemleri ve Turgut Özseven-VTYS) tek tablodan iki tabloya geçiş ya da diğer bir ifade ile tek tablonun iki tabloya uygun alanlarca bölünmesi işleminin 2NF safhasında gerçekleştiği bildirilmektedir. Fakat siz burada 1NF safhasında işlemi gerçekleşeceğini bildirmişsiniz.
    Teşekkürler.

  3. Şadi Evren ŞEKER Article Author

    Murat Bey;

    Bahsettiğiniz kaynaklar ne yazık ki bende yok. Bu kaynaklarda bahsettiğiniz tanım ne amaçla yazılmış bilmiyorum ancak sizin mesajınızdan sonra kaynakları tekrar taradım ve bütün kaynaklarda ittifakla !NF için aşağıdaki ibare bulunuyor:

    “A relational schema R is in first normal form if the domains of all attributes of R are atomic”

    Bu tanımı tam olarak Türkçeye çevirirsek, bir ilişkinin birinci normal şekilde olmasının, bu ilişkinin bütün alanlarının atomik olmasına bağlı olduğunu söyleyebiliriz. Buradaki atomiklik (atomicity) tanım olarak bir alanın daha alt alanlara bölünemeyecek kadar indirgenmesi olarak algılanmalıdır. Örneğin bir sayı içeren alan veya bir dizgi (string) içeren alan atomik olarak kabul edilebilir. Buna karşılık, bir çalışanın bütün bilgilerinin, çalışanın çalıştığı departmanla birlikte tutulması atmoik olmayan bir durumdur. Gereksiz yere her çalışan için departman bilgileri tekrarlanmaktadır. Atomiklik şartını sağlamak için gerekirse birden fazla tabloya bölünebilir, gerekmiyorsa da bölünmez. Birinci normal şekli tanımlarken tablonun bölünmesi veya bölünmemesi gibi bir şart koymak doğru değildir.

    Yukarıdaki yazıda geçen ve tablolara bölünen örneğin çok benzeri wikipedia’da aynı başlıklı yazıda geçmektedir. Ayrıca internet üzerindeki pekçok kaynakta first normal form başlığı altında birden fazla tabloya bölme işlemi yapıldığını görebilirsiniz. Bu konudaki en meşhur kitaplardan birisi olan Silberschatz’ın kitabında da 1NF tanımı, tam olarak yukarıdaki şekilde yapılmaktadır.

    Ayrıca, yukarıda sizin verdiğiniz tanımda geçen 2NF de hatalıdır. Bir ilişkinin 2NF olması için öncelikle 1NF şartını sağlaması, ilave olarak da bütün asal olmayan alanlarının (nonprime attributes) bir aday anahtara (candidate key) veya bu aday anahtarın bir alt kümesine (subset) bağlanabilmesidir. Bununla ilgili detaylı bir anlatımın bulunduğu yazıyı zaten sitede yayınlamıştım. Kısacası 1NF veya 2NF tanımını tablo sayılarına bağlamak hatadır.

    Kişisel görüşüm yukarıdaki alıntılamanızda bir hata olduğu veya ortada bir yanlış anlama olduğu yönündedir. Muhtemelen bu kaynaklarda da detaylıca okunduğunda benim anlatmaya çalıştığıma yakın bir sonuç çıkıyordur.

    Aslında daha detaylı anlatmam gerekirse, first normal form, kavramı, Codd tarafından 1970 yılında yayınladığı makalede, First Order Logic (birinci seviye mantık) ile uyumlu bir veri tabanı oluşturma sevdasından çıkmaktadır. Buna göre zaten mantık kuralları arasında bir bağlantı olması (yani ilişkilerin bölünmesi) mümkündür. 1NF içerisinde bölünme olmaz demek, FOL (first order logic) ile de çelişen bir açıklamadır. Kendisinin 1NF kavramını ilk kez ortaya atan yayını için aşağıdaki referansı edinip okuyabilirsiniz:

    Codd, E.F. (June 1970). “A Relational Model of Data for Large Shared Data Banks”. Communications of the ACM 13 (6): 377–387. doi:10.1145/362384.362685.

  4. furkan

    elinize sağlık anlatım gayet güzel olmuş. yorum kısmında yaptığınız açıklamaları da yazınıza eklerseniz daha derli toplu ve daha açıklayıcı olacaktır..

  5. Ayşenur

    Sadece konuyla ilgili bilgi paylaşmakla kalmayıp her yorumu dikkate alarak insanların kafasında soru işareti kalmayacak şekilde; konuyu, daha ince detaylarına kadar anlatıyorsunuz. Emekleriniz için çok teşekkürler.

Bir cevap yazın

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