İlişkisel veritabanı yönetim sistemlerinde (RDBMS) sağlıklı, ölçeklenebilir ve hatasız bir yapı kurmanın temel koşulu veritabanı tasarımıdır. Kötü planlanmış bir veritabanı şeması; veri tekrarına, disk alanı israfına ve en önemlisi veri tutarsızlıklarına yol açar. Bu problemlerin önüne geçmek için uygulanan sistematik yaklaşıma normalizasyon adı verilir.
Normalizasyon Nedir ve Neden Gereklidir?
Normalizasyon, bir ilişkisel veritabanındaki tabloları mantıksal bir düzene oturtarak veri tekrarını en aza indirme ve veri bütünlüğünü en üst düzeye çıkarma sürecidir. 1970’li yıllarda Edgar F. Codd tarafından ortaya atılan bu yöntem, tabloları belirli kurallar kümesine (normal formlar) göre ayrıştırmayı hedefler.
Normalizasyon uygulanmamış tablolarda üç temel anomali türü görülür:
- Ekleme Anomalisi: Yeni bir veri kaydetmek istediğinizde, zorunlu olmayan başka verileri de girmeye mecbur kalmanız veya eksik bilgi yüzünden geçerli bir kaydı ekleyememeniz durumudur.
- Güncelleme Anomalisi: Aynı veri birden fazla satırda tekrar ettiği için bir değeri değiştirdiğinizde tüm satırları güncellemeniz gerekir. Gözden kaçan tek bir satır, veritabanında tutarsızlığa neden olur.
- Silme Anomalisi: Bir satırı sildiğinizde, o satırla ilişkili ancak aslında kaybetmek istemediğiniz diğer bilgilerin de kalıcı olarak kaybolmasıdır.
Bu anomalileri gidermek, sorgu karmaşıklığını ve disk maliyetini azaltırken sistemin bakımını kolaylaştırır.
Normalizasyon Aşamaları (Normal Formlar)
Normalizasyon işlemi adım adım ilerler. Her aşamaya Normal Form (NF) denir. Bir tablonun üst seviye bir normal forma geçebilmesi için öncelikle kendisinden önceki formun tüm şartlarını karşılaması zorunludur.
Birinci Normal Form (1NF)
Bir tablonun 1NF standardında kabul edilmesi için şu şartları sağlaması gerekir:
- Her sütun yalnızca atomik (bölünemez tekil) değerler içermelidir.
- Aynı sütunda birden fazla değer virgülle veya başka bir ayraçla tutulmamalıdır.
- Tabloda benzersiz bir birincil anahtar (Primary Key) bulunmalıdır.
- Yinelenen sütun grupları yer almamalıdır.
Örneğin, bir kullanıcının birden fazla telefon numarasını tek bir hücrede virgülle saklamak 1NF kuralını bozar. Aşağıdaki SQL yapısında bu durumu düzeltmek için atomik yapı kurulur:
CREATE TABLE kullanicilar (
kullanici_id INT PRIMARY KEY,
ad VARCHAR(50),
soyad VARCHAR(50)
);
CREATE TABLE kullanici_telefonlari (
telefon_id INT PRIMARY KEY,
kullanici_id INT,
telefon_no VARCHAR(15),
FOREIGN KEY (kullanici_id) REFERENCES kullanicilar(kullanici_id)
);
Bu kod bloğunda, birden fazla telefon numarası ana tablodan ayrılarak bağımsız bir tabloya taşınmıştır. Her telefon kaydı tek bir satırda tutulur ve kullanıcı tablosuna bir yabancı anahtar (Foreign Key) ile bağlanır. Böylece veri atomik hale gelir.
İkinci Normal Form (2NF)
Bir tablonun 2NF seviyesinde olması için:
- Tablo öncelikle 1NF standartlarını taşımalıdır.
- Kısmi bağımlılık (partial dependency) bulunmamalıdır. Yani bileşik birincil anahtarın (composite key) kullanıldığı tablolarda, anahtar olmayan her sütun anahtarın tamamına bağımlı olmalıdır; anahtarın sadece bir parçasına bağımlı olamaz.
Bileşik anahtar kullanılmayan, tek bir sütundan oluşan birincil anahtara sahip ve 1NF’ye uyan tablolar otomatik olarak 2NF standardındadır.
Kısmi bağımlılığı çözmek için ilişkili sütunlar yeni bir tabloya bölünür:
CREATE TABLE siparisler (
siparis_id INT PRIMARY KEY,
siparis_tarihi DATE
);
CREATE TABLE urunler (
urun_id INT PRIMARY KEY,
urun_adi VARCHAR(100),
birim_fiyat DECIMAL(10, 2)
);
CREATE TABLE siparis_kalemleri (
siparis_id INT,
urun_id INT,
adet INT,
PRIMARY KEY (siparis_id, urun_id),
FOREIGN KEY (siparis_id) REFERENCES siparisler(siparis_id),
FOREIGN KEY (urun_id) REFERENCES urunler(urun_id)
);
Bu örnekte siparis_kalemleri tablosu siparis_id ve urun_id sütunlarından oluşan bileşik bir anahtara sahiptir. adet sütunu hem siparişe hem de ürüne doğrudan bağlıdır. Ürünün adı veya fiyatı gibi yalnızca urun_id‘ye bağlı veriler bu tabloda tutulmayıp urunler tablosuna aktarılarak 2NF sağlanmıştır.
Üçüncü Normal Form (3NF)
Bir tablonun 3NF seviyesinde kabul edilmesi için:
- Tablo 2NF kurallarına tam olarak uymalıdır.
- Geçişli bağımlılık (transitive dependency) bulunmamalıdır. Birincil anahtar olmayan bir sütun, birincil anahtar olmayan başka bir sütuna bağımlı olamaz. Tüm anahtar dışı sütunlar yalnızca birincil anahtara doğrudan bağlı olmalıdır.
Örneğin, çalışanlar tablosunda departman adı ve departman yöneticisi bilgilerinin tutulması geçişli bağımlılık oluşturur; çünkü yönetici bilgisi çalışana değil, departmana bağlıdır.
CREATE TABLE departmanlar (
departman_id INT PRIMARY KEY,
departman_adi VARCHAR(50),
yonetici_id INT
);
CREATE TABLE calisanlar (
calisan_id INT PRIMARY KEY,
ad VARCHAR(50),
soyad VARCHAR(50),
departman_id INT,
FOREIGN KEY (departman_id) REFERENCES departmanlar(departman_id)
);
Bu ayrım sayesinde departman adında yapılacak bir değişiklik yalnızca departmanlar tablosundaki ilgili satırda güncellenir. Yüzlerce çalışanın satırını tek tek güncellemek gerekmez ve güncelleme anomalisi engellenmiş olur.
Boyce-Codd Normal Formu (BCNF)
BCNF, Üçüncü Normal Formun özel ve daha katı bir varyasyonudur. Genellikle bir tabloda birden fazla aday anahtar (candidate key) bulunduğunda devreye girer. BCNF kuralına göre, tablodaki her belirleyici (determiner – diğer sütunların değerini belirleyen sütun) mutlaka bir aday anahtar olmak zorundadır. Çoğu 3NF tablosu zaten BCNF şartını karşılar; ancak çoklu bileşik anahtarların kesiştiği özel senaryolarda ek ayrıştırma gerekebilir.
Normalizasyon ile Performans Dengesi
Normalizasyon düzeyi arttıkça tablolardaki veri tekrarı minimuma iner ve veri bütünlüğü garanti altına alınır. Ancak bu durum, okuma işlemlerinde daha fazla tablonun JOIN operatörü ile birleştirilmesini gerektirir.
Yoğun okuma (SELECT) trafiği olan raporlama sistemlerinde, çok fazla birleştirme işlemi sorgu performansını düşürebilir. Bu gibi senaryolarda kontrollü bir şekilde veri tekrarına izin verme işlemine denormalizasyon (denormalization) denir. Başarılı bir veritabanı mimarisinde amaç her zaman körü körüne en yüksek normal forma ulaşmak değil; veri tutarlılığı ile okuma/yazma performansı arasındaki dengeyi kurmaktır. Genellikle operasyonel (OLTP) sistemler için 3NF idealken, analitik (OLAP) sistemlerde denormalize modeller tercih edilir.
Özet ve Sonraki Adımlar
Veritabanı normalizasyonu, ilişkisel veritabanlarının temel taşıdır. 1NF ile verileri atomik hale getirir, 2NF ile kısmi bağımlılıkları temizler, 3NF ile geçişli bağımlılıkları ortadan kaldırarak veritabanınızı tutarlı ve güvenilir kılarsınız.
Tasarımınızı 3NF seviyesine getirdikten sonraki adımda, tablolar arasındaki yabancı anahtarların performansını korumak için indeksleme stratejilerini öğrenmeli ve sorgu planlarını (EXPLAIN analizleri) inceleyerek sisteminizin darboğazlarını tespit etmelisiniz.


Yorumlar
Henüz yorum yok. İlk yorumu siz yazın.