İlişkisel veritabanının temel amacı nasıl veri tekrarını önlemek ve esneklik kazandırmaksa, normalizasyon da tablolardaki tekrarları önlemek ve onlara esneklik kazandırmak için oluşturulmuş kurallar bütünüdür. Genellikle 1NF(1. Normal Form),2NF(2. Normal Form) ve 3NF(3. Normal Form) olmak üzere üç normalizasyon kuralı kullanılmaktadır. Aslında daha fazladır fakat bizim kullanacağımız bu kadar olacaktır.
Kendi çalışmamızdan örnek verelim. Aşağıda cari hesap tablosunu görüyoruz.
Telefon numaraları 1,2 şeklinde belirlenmiş. Ayrıca 2 tür adres tipi var ve adresler birden fazla olabilir. Bunun dışında adresi ilgilendiren ülke bilgisi, ilçe ve şehir bilgisi de adres sayısınca olmalıdır. Bunun dışında sorumlular da iki adet şeklinde girilmiş. Bir cari hesapla ilgili birden fazla sorumlu olabilir. Örneğin bu tablo için 2’den fazla sorumlu olursa tasarıma dönüp relevant3 şeklinde bir sütun daha eklememiz gerekecek bu ise hoş bir durum değildir. Bunun yerine normalizasyon kurallarını uygulayabiliriz. Aşağıda tablonun normalize edilmiş hali bulunmaktadır. Burada sorumlular tablodan ayrılmış, iletişim numaraları, mailler, adresler ayrı tablo haline getirilmiştir. Şimdi bir cari hesap için istediğimiz kadar adres girebileceğimiz esnek yapıda bir veritabanı dizaynına sahip olduk.
Burada adres1,adres2 diye gösterilen satırların ayrı bir tabloya alınması 1NF kuralıdır.
Bir önceki tabloda cari_hesap ve cari_hesap detayı aynı id’ye sahip iki tablo gibi duruyordu. Bu yüzden bunları cari hesap diye bir tabloda birleştirmiş olduk. Bu 2NF kuralıdır. Bunun tersi de doğrudur. Örneğin cari hesap tablomuzda sorumlular diye bir sütun varken, cari hesap id’si ile ilişkisi olabilmesi için ayırmış olduk.3NF bizim şu ana kadar ki tasarımızda yok o yüzden şöyle açıklayabiliriz:
“Bir tablo için, anahtarı olmayan bir alan, anahtarı olmayan başka hiç bir alana bağlı olamaz. Örneğin, kitaplarımız için cilt tipi adında bir alan ekleyip burada da karton kapak için K, deri cilt için D, spiral cilt için S yazsaydık, bu kodlama, kitap tablosunun birincil anahtarı olan kitapNo alanına bağlı bir kodlama olmayacaktı. Çünkü bu kodlama bir başka anahtarı olmayan alana bağlıdır. Bunun sonucunda da veritabanımızda, karşılığı olmayan bir kodlama yer almış olacaktır. Cilt tipi bilgisini kodlu olarak tutan alan aslında cilt tipi açıklaması olan başka bir alana bağlıdır. Bu ilişki başka bir tabloda tutulmalıdır.
Bu durumda, ciltSekli adında bir tablo açmamız gerekir. Bu tablonun alanları da ciltTipKodu ve ciltSekli olmalıdır. Ancak bundan sonra, kitaplar tablosunda ciltTipi adında bir sütun açıp buraya da D,S,K gibi kodları yazabiliriz.”1
Daha fazla bilgi için dipnot olarak verilen bağlantıdaki dökümanı inceleyebilirsiniz.