25 Şubat 2018 Pazar

NORMALİZASYON


      Normalizasyon; veri tabanı tasarım aşamasında veri tekrarını, veri kaybını veya veri yetersizliğini önlemek için gerçekleştirilen işlemlerdir.
      Normalizasyon tanım olarak ise; (Ayrıştırma),  veri tabanlarında çok fazla sütun ve satırdan oluşan bir tabloyu tekrarlardan arındırmak için daha az satır ve sütun içeren alt kümelerine ayrıştırma işlemidir.
       İlişkisel veri tabanı tasarlanması aşamasında verinin tekrarlanmasını, kaybını veya yetersizliğini önlemek için normalleştirme (normalization) işlemi uygulanır.
      Normalleştirme, aynı zamanda “ilk taslak” veri tabanı tasarımının üzerinde revizyonlar yapmanın yolu, taslağı son haline yaklaştırmanın yöntemlerden birisidir.
      Normalleştirmenin altyapısı da, ilişkisel modelin altyapısı gibi matematikseldir. Temel alınan kavram, işlevsel bağımlılık (functional dependency)  denilen bir kavramdır.

Normalizasyonun Amacı
Veri Bütünlüğünün Sağlanması
–Gereksiz veri tekrarını önleyerek verilerdeki bozulmaları önlemek
Uygulamadan Bağımsızlık
–Uygulama değişse bile veri tabanı tutarlı olarak çalışmalı
Performansı Arttırmak
–Veri tekrarı en aza iner ve arama hızlı olur.

Normalleştirme Aşamaları
   Birinci Normal Form
   İkinci Normal Form
   Üçüncü Normal Form
   Boyce-Codd Normal Formu
   Dördüncü Normal Form
    …
Konuyu detaylandırabilmek için bir veri tabanı oluşturalım ve normalizasyonunu yapalım. Tabloda bir teknik destek firmasının çalışanları, servis araçları, servis şoförleri ve servis verilen semtler bulunsun. Her bir şoför tek araç ile semt bazında servis yapmaktadır.
Normal Olmayan Form:

Birinci Normal Form
Bir veri tabanının 1NF olabilmesi için aşağıdaki özellikleri karşılayabilmesi gerekir:
 >Aynı tablo içinde tekrarlayan kolonlar bulunamaz,
 >Her kolonda yalnızca bir değer bulunabilir
 >Her satır bir eşsiz anahtarla tanımlanmalıdır (Unique Key - Primary Key)
Yukarıdaki tabloyu 1NF yapacak olursak:
İşte şimdi oldu. "Id" sütununu eşsiz anahtar olarak atadık. 1NF kurallarına harfiyen uyduk. 

 İkinci Normal Form
Bir veri tabanının 2NF olabilmesi için aşağıdaki özellikleri karşılayabilmesi gerekir:
>Tablo 1NF olmalıdır,
>Anahtar olmayan değerler ile kompozit (bileşik) anahtarlar arasında kısmi (partial) bağımlılık durumu oluşmamalıdır. Kısmi bağımlılık durumu, anahtar olmayan herhangi bir değer kompozit bir anahtarın yalnızca bir kısmına bağıl ise oluşur.
>Herhangi bir veri alt kümesi birden çok satırda tekrarlanmamalıdır. Bu tür veri alt kümeleri için yeni tablolar oluşturulmalıdır.
>Ana tablo ile yeni tablolar arasında, dış anahtarlar (foreign key) kullanılarak ilişkiler tanımlanmalıdır.
      Aslında üç ve dördüncü maddeler ikinci maddenin sonuçlarıdır. Eğer anahtar olmayan bir kolonla herhangi bir komposit anahtar arasında kısmi bağımlılık varsa her zaman tekrarlayan veri alt kümeleri oluşur. Bu durumu düzeltmek için bahis konusu alt kümeleri farklı bir tablo haline getirmeli ve elde ettiğimiz tablolar ile ana tablomuz arasındaki ilişkiyi tanımlamalıyız.

En son oluşturduğumuz tablomuzu bir gözden geçirelim: "Çalışan - Soyad" kombinasyonuna bakın. Çok tekrarlanıyor çünkü eşsiz anahtara verimli bir şekilde bağlayamamışız. Bunu düzeltmek için tablomuzu aşağıdaki gibi ikiye bölelim ve aralarında bir ilişki oluşturalım:
    Yeni tablomuz ile ana tablomuzu ilişkilendirmek için "Cid" (Çalışan ID) isimli bir kolon yarattık. Dikkat ederseniz bu kolonun aldığı değer ana tablomuzdaki eşsiz anahtarı işaret ediyor. Bu ilişkilendirmeye Foreign Key diyoruz.

Üçüncü Normal Form
Bir veri tabanının 3NF olabilmesi için aşağıdaki özellikleri karşılayabilmesi gerekir:
>Veri tabanı 2NF olmalıdır,
>Anahtar olmayan hiç bir kolon bir diğerine (anahtar olmayan başka bir kolona) bağıl olmamalı ya da geçişken fonksiyonel bir bağımlılığı (transitional functional dependency) olmamalıdır. Başka bir deyişle her kolon eşsiz anahtara tam bağımlı olmak zorundadır.
         Veri tabanımızı 3NF şartlarına uydurabilmek için anahtar olmayan ve eşsiz anahtara tam bağımlı olmayan tüm kolonları kaldırmalıyız. Dikkat ederseniz bizim tablomuzda "Araç" kolonu eşsiz anahtarımıza değil "Şoför" kolonuna bağımlı. Birbirine bağlı olan bu iki kolonu (Şoför - Araç) ayrı bir tabloya ayırmamız ve tablomuzla aralarında bir ilişki yaratmamız gerekiyor.

Öncelikle şoför tablosu adında yeni bir tablo oluşturduk. Bu tabloda Sid (Şoför ID) adıyla bir eşsiz anahtar yarattık ve Servis tablomuzdaki Sid kolonundan bu eşsiz anahtara referans vererek foreign key oluşturduk.

BCNF / 3.5NF (Boyce-Codd Normal Form)
Bir veri tabanının 3.5NF olabilmesi için aşağıdaki özellikleri karşılayabilmesi gerekir:
>Veri Tabanı 3NF olmalıdır,
>Her determinant (belirleyici kolon) aynı zamanda bir aday anahtar olmalıdır.
>Determinant: Aynı satırdaki diğer kolon değerlerini belirlemek için kullanılan kolon kümesi determinant olarak adlandırılır.

        Servis tablomuza dikkatle baktığımızda iki tane determinant olduğunu görebiliriz. Semt kolonu, Cid - Sid kombinasyonunun; Sid ise Cid kolonunun determinantıdır.
        Bu noktada Semt kolonunun hali hazırda bir aday anahtar olduğunu görebiliyoruz çünkü her bir değer tekrar oluşturmaksızın tüm kayıt satırını tanımlayabilmekte. Öte yandan Sid için aynı şeyi söylemek mümkün değil çünkü tekrarlanıyor.
        Elbette bu durumu düzeltmek için tabloyu ikiye ayıracak semt tablosunun değerini tabloları ilişkilendirmek için foreign key olarak kullanacağız.




        Görülebileceği gibi artık tablolarımızın hiçbirinde aday anahtar olmayan determinant yok. Bu nedenle veri tabanımız BCNF'tir diyebiliriz.

Dördüncü Normal Form
Bir veri tabanının 4NF olabilmesi için aşağıdaki özellikleri karşılayabilmesi gerekir:
>Veri Tabanı 3NF olmalıdır,
>Çok-değerli bağımlılıkları (Multli-Valued dependency) olmamalıdır.
       Multi-Valued Dependency: Bu durum bir ya da daha çok veri satırının var olması, aynı tabloda başka bir (ya da daha çok) veri satırının bulunmasını gerektirdiğinde ortaya çıkar. 
Örneğin, bir yazılım firması düşünelim. Geliştirdikleri yazılımların masaüstü bilgisayarlar için olanlarını tek-kullanıcılı ve çok-kullanıcılı olarak iki versiyonla piyasaya sunuyor olsunlar. Diyelim ki bu firmanın geliştirdiği tüm yazılımları barındıran bir veri tabanı oluşturuyoruz. Bu veri tabanında bir masaüstü yazılımın tek-kullanıcılı versiyonunu eklediysek mutlaka bir başka satırda aynı yazılımın çok-kullanıcılı versiyonu için de bir kayıt açılmış olmak durumundadır...

Anahtar (Key)
Anahtar bir veya birden fazla alanın bir satır için niteleyici olarak girilmesi için zorlanan bir çeşit zorlayıcıdır.
2 çeşit anahtar vardır:
              Birincil Anahtar (Primary Key)
              Yabancı Anahtar (Foreign Key)
Birincil anahtar
Bir kayıta ulaşmayı sağlayacak anahtar veridir.
Örneği öğrenciler arasında iki Ahmet var. Arama yaparken istediğimiz Ahmet’i bulmak için her bir öğrenciye özel bir numara olmalıdır.
Örneğin öğrenci numarası
Birden fazla alanda birlikte birincil anahtar olabilir
Yabancı anahtar
Bir tabloya girilebilecek kayıtları başka bir tablonun belli alanındaki verilerle sınırlandırmaya ve
 ilişkilendirmeye yarar.
Örneğin öğrencilerin not verilerinin girildikleri tablodaki her satıra öğrenci bilgileri tablosundaki öğrenci no ile eşleşen bir değer girilmesi gibi.

bir sonraki dersimizde görüşmek üzere esen kalın... ebi

yararlanılan kaynaklar:
Hakan ÖZAKAR [web adresi]
Öğr. Gör. M. Mutlu YAPICI[WEB Adresi]

Hiç yorum yok:

Yorum Gönder

yukarı git