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:
>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.
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.
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]
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]