Normalizasyon Kavramı
Normalizasyon kavramı, ilişkisel veritabanı modelinin kurucusu olan Edgar F. Codd tarafından oluşturulmuş bir kavramdır. Tabloların tasarımı sırasında normalizasyonu uygun seviyede kullanarak performans artışı ile birlikte veri tutarlılığının ve bütünlüğünün korunması sağlanır. Normalizasyon işlemleri belli seviyelerden oluşur. Bir seviyedeki işlemler tamamlanmadan diğer seviyeye geçilmez. Her seviyede tablo ve kolon bazlı işlemler yapılarak tabloların daha atomik veriler tutması hedeflenir. Temel olarak 6 normalizasyon seviyesi vardır ancak en çok kullanılan 3 normalizasyon seviyesini anlatacağız.
1. Normalizasyon Seviyesi: 1. Normalizasyon Seviyesi en düşük seviye olarak nitelendirilebilir. Bir veritabanının bu seviyede normalizasyona sahip olması için aşağıdaki kurallara uyması gerekir.
- Aynı tabloda tekrarlayan kolonların bulunmaması
- Her kolonda yalnızca bir değer bulunması
- Her satır için tanımlayıcı bir anahtar kolonun bulunması
Bu gereksinimlerin nedenlerini aşağıdaki örneklerde görebiliriz.
Ad |
Soyad |
Telefon 1 |
Telefon 2 |
Telefon 3 |
Nurullah |
Çakır |
(123) 4567890 |
(123) 1234567 |
(123)1231231 |
Hakan |
Gürbaşlar |
(123) 1111111 |
Yukarıdaki örnekte Nurullah Çakır ismindeki kişinin 3 adet Telefon bilgisi var. Ancak Hakan Gürbaşlar ismindeki kişinin 1 adet telefon bilgisi olduğu için Telefon 2 ve Telefon 3 alanları boş kalmış. İlerde 4 veya daha fazla telefonu olan bir kişi eklendiğinde yeni kolonların açılması gerekecek. Bu durum gereksiz bir şekilde tablodaki kolon sayısını arttıracaktır. Bu nedenle aynı tabloda tekrarlayan kolonların bulunmaması gerekir
Ad |
Soyad |
Telefon |
Nurullah |
Çakır |
(123) 4567890 , (123) 1234567 , (123)1231231 |
Hakan |
Gürbaşlar |
(123) 1111111 |
Tabloyu bu şekilde oluşturursak kolon sayısı artmamış olacak. Fakat telefonu (123) 1234567 olan kişiyi sorgulamak ya da (123) 1234567 numaralı telefonun kaydını silmek istersek yapacağımız işlem daha karmaşık olacaktır.
Ad |
Soyad |
Telefon |
Nurullah |
Çakır |
(123) 4567890 |
Nurullah |
Çakır |
(123) 1234567 |
Nurullah |
Çakır |
(123) 1231231 |
Hakan |
Gürbaşlar |
(123) 1111111 |
Tabloyu bu hale dönüştürdüğümüzde artık telefon bilgileri tek sütunda bulunup, her satırda tek bir telefon bilgisi tutulmaktadır. Ancak Nurullah Çakır ismindeki 3 telefon kaydı aynı kişiye mi yoksa farklı kişilere mi ait belli değildir. Bu nedenle yeni bir kolon tanımlayarak aynı ya da farklı kişiler olduğunu tespit edebiliriz.
ID |
Ad |
Soyad |
Telefon |
1 |
Nurullah |
Çakır |
(123) 4567890 |
1 |
Nurullah |
Çakır |
(123) 1234567 |
1 |
Nurullah |
Çakır |
(123)1231231 |
2 |
Hakan |
Gürbaşlar |
(123) 1111111 |
2. Normalizasyon Seviyesi: Bu normalizasyon seviyesindeki adımları uygulayabilmemiz öncelikle 1. Normalizasyon Seviyesi işlemlerinin tamamlanmış olması gerekir. Sonrasında kontrol etmemiz gereken işlemler ise;
- Belirli sayıda kolondan oluşan alt kümede tekrarlanan kayıtlar bulunmaması, bu alt küme için ayrı bir tablo oluşturulması.
- Alt kümeden oluşan tablo ile asıl tablo arasında ilişki tanımlayacak anahtarların (foreign key) tanımlanması.
Birinci normalizasyon seviyesinde elimizde bulunan tabloda ad ve soyaddan oluşan alt kümede tekrarlı kayıtların olduğunu görüyoruz. O zaman Kişi bilgisini ayrı, kişilerin telefon bilgilerini ayrı tablolarda tutmalıyız. Bunun nedeni yapılacak bir güncellemede 1. Normalizasyon seviyesinde aynı kişi için birden fazla güncelleme yapılmasıdır. Kişi bilgileri için ayrı bir tablo oluşturduğumuzda, kişi bilgisinin, mesela bayanlarda soyadının, değişmesi durumunda sadece 1 adet update yeterli olacaktır.
Kişi tablosunu aşağıdaki gibi oluşturalım. (ID değerleri bir önceki tablodaki ID değerleriyle karıştırılmaması için 101 ve 102 olarak verilmiştir.)
ID |
Ad |
Soyad |
101 |
Nurullah |
Çakır |
102 |
Hakan |
Gürbaşlar |
Telefon tablosunu aşağıdaki hale dönüştürelim (1. Normalizasyon seviyesinden dolayı her telefona farklı ID değeri verilmiştir.)
ID |
Telefon |
1 |
(123) 4567890 |
2 |
(123) 1234567 |
3 |
(123)1231231 |
4 |
(123) 1111111 |
Bu tabloda hangi telefonun hangi kişiye ait olduğu belli değildir. Burada kişi tablosu için oluşturduğumuz ID değerini eklediğimizde ise tablo aşağıdaki formda olur.
ID |
Kişi ID |
Telefon |
1 |
101 |
(123) 4567890 |
2 |
101 |
(123) 1234567 |
3 |
101 |
(123)1231231 |
4 |
102 |
(123) 1111111 |
Böylece telefon numarasından Kişi tablosundaki ID değerine, kişi tablosundaki ID değerinden ise kişinin tüm bilgilerine erişiriz.
3. Normalizasyon Seviyesi: Bir tablonun 3. Normalizasyon seviyesinde olması için öncelikli olarak 2. Seviyede olması gerekir. Bu seviyede ayrıca birincil anahtar (primary key) olmayan her kolonun başka bir kolona bağlı olmaması da kontrol edilir.
Bir önceki örnekte oluşturduğumuz kişi tablosuna adres bilgisi olarak ilçe ve ili ekleyelim.
ID |
Ad |
Soyad |
İl |
İlçe |
101 |
Nurullah |
Çakır |
Ankara |
Çankaya |
102 |
Hakan |
Gürbaşlar |
Ankara |
Çankaya |
Birincil anahtar (primary key) olmayan ilçe kolonu, yine birincil anahtar (primary key) olmayan il kolonuna bağlı. Bu nedenle il ve ilçe bilgisini tutan ayrı bir tablo oluşturmamız gerekir.
Normalizasyon seviyesi arttıkça OLTP sistemlerde performans artışı ve veri bütünlüğü sağlanır. OLAP sistemlerde ise yoğun verileri okuma işlemleri nedeniyle normalizasyon seviyesini arttırarak tabloların atomik yapıda olması, join işlemlerini arttırarak performansı düşüreceği için daha az önem taşır.