SQL Data Anormalliği (Anomaly)
Sql data anormalliği (anomaly), bir veritabanı tasarımındaki belirli durumları veya koşulları ifade eder. Bu durumlar, veritabanının bütünlüğünü, tutarlılığını veya etkililiğini etkileyebilir. Veritabanı anormallikleri genellikle veritabanı tasarımındaki normalizasyon sürecinde ortaya çıkar.
Veritabanı anormallikleri genellikle üç kategoride incelenir:
- Ekleme (Insertion) Anomalisi: Yeni veri eklerken ortaya çıkan problemleri ifade eder. Özellikle, belirli koşullar altında bir veri eklerken diğer veri bileşenlerini korumak zor olabilir.
- Güncelleme (Update) Anomalisi: Mevcut veriyi güncellerken ortaya çıkan problemleri ifade eder. Belirli güncelleme işlemleri, veri tutarlılığını veya bütünlüğünü bozabilir.
- Silme (Deletion) Anomalisi: Veri silerken ortaya çıkan problemleri ifade eder. Belirli koşullar altında veri silme işlemi, başka verilere olan bağımlılıkları nedeniyle sorunlara yol açabilir.
Bu anormalliklerin çoğu, veritabanı tasarımındaki normalizasyon süreçlerini uygulamamak veya uygun bir şekilde düşünmemekten kaynaklanabilir. Normalizasyon, bu anormallikleri azaltmaya veya ortadan kaldırmaya yardımcı olur, çünkü normalizasyon süreci veritabanını daha iyi organize etmeyi ve veri bütünlüğünü sağlamayı amaçlar.
Ekleme (Insertion) Anomalisi:
Ekleme anormallisi, yeni veri eklenirken ortaya çıkan sorunları ifade eder. Bu durumlar şunları içerebilir:
- İlişkisel Olmayan Veri Ekleme: İlişkisel bir tabloya veri eklenirken, diğer sütunlar için geçerli olmayan bir veri eklemek zorunda kalmak.
- İlişkisel Veri Eksikliği: Bir tablonun diğerine bağımlı olduğu durumlarda, bağımlılık sağlayan tablodaki bir anahtar değeri olmadan yeni bir kayıt eklemek.
Örnek-1: Diyelim ki, bir tablonuz var ve bu tabloda müşterilerin siparişlerini tutuyorsunuz:
MusteriSiparis (MusteriID, MusteriAdi, SiparisID, UrunAdi, Miktar)
Eğer bir müşteri henüz herhangi bir sipariş vermemişse, bu durumu ifade etmek için tabloya boş değerler eklerseniz:
1, "Ahmet", NULL, NULL, NULL
Ancak, bu durumda herhangi bir müşterinin siparişleri olmadığını mı, yoksa sadece bilgilerin eksik olduğunu mu anlamak zor olabilir. Bu, ekleme anormallisi olarak adlandırılır.
Örnek-2: Diyelim ki, bir kütüphane veritabanınız var ve aşağıdaki gibi bir tablonuz bulunuyor:
Kitaplar (KitapID, KitapAdi, Yazar, YayinYili, Kategori)
Eğer yeni bir kitap eklemek istiyorsanız, ancak bu kitabın kategorisi henüz belirlenmemişse, tabloya aşağıdaki gibi bir ekleme yapmanız gerekebilir:
INSERT INTO Kitaplar (KitapID, KitapAdi, Yazar, YayinYili, Kategori) VALUES (1, 'Harry Potter', 'J.K. Rowling', 2001, NULL);
Bu durumda, ekleme anormallisi oluşur çünkü Kategori alanı için NULL bir değer eklenmiş olur.
Güncelleme (Update) Anomalisi:
Güncelleme anormallisi, mevcut veriyi güncellerken ortaya çıkan sorunları ifade eder. Bu durumlar şunları içerebilir:
- Bağımlılık Sorunları: Bir sütunun başka bir sütuna bağımlı olduğu durumda, bağımlı sütunu güncellemede yaşanan sorunlar.
- Hesaplamalar ve Bağımlılıklar: Bir sütunun hesaplamalı bir değere bağımlı olduğu durumda, bağımlı değeri güncellememenin neden olduğu sorunlar.
Örnek-1: Diyelim ki, bir tablonuz var ve bu tabloda öğrenci notlarını tutuyorsunuz:
Notlar (OgrenciID, OgrenciAdi, Sinav1, Sinav2, Ortalama)
Ortalama değeri, Sinav1 ve Sinav2’nin ortalamasını tutar. Eğer bir öğrencinin Sinav1 notunu güncellerseniz, Ortalama sütunu da güncellenir. Ancak, Ortalama sütunu üzerinden yapılan hesaplama baz alındığında, Sinav2’nin değişmediğini bilmek zordur. Bu durum, güncelleme anormallisi olarak adlandırılır.
Örnek-2: Diyelim ki, yine kütüphane veritabanınızda şu tablo bulunuyor:
Kitaplar (KitapID, KitapAdi, Yazar, YayinYili, Kategori)
Ve bir kitabın kategorisi, yayınevi ve diğer bilgileri değiştiğinde, sadece kategoriyi güncellemek isterseniz:
UPDATE Kitaplar SET Kategori = 'Fantastik' WHERE KitapID = 1;
Ancak, bu durumda diğer bilgiler değişmediği için, güncelleme anormallisi oluşur. Çünkü diğer bilgileri de güncellemeniz gerekmezse, tablo içinde tutarlı bir durum olmaz.
Silme (Deletion) Anomalisi:
Silme anormallisi, veri silme işlemlerinden kaynaklanan sorunları ifade eder. Bu durumlar şunları içerebilir:
- Veri Bağımlılıkları: Bir tablodaki verilerin başka bir tablo tarafından bağımlı olduğu durumda, bir veri silindiğinde bu bağımlılıkların neden olduğu sorunlar.
- Dengesiz Bağlantılar: İki tablo arasında dengesiz bir bağlantı varsa ve bir tablo diğerinden daha fazla bağımlılık içeriyorsa, silme işlemleri dengesiz sonuçlara yol açabilir.
Örnek-1: Diyelim ki, bir müşteri ve sipariş tablonuz var:
Musteriler (MusteriID, MusteriAdi, Telefon)
Siparisler (SiparisID, MusteriID, UrunAdi, Miktar)
Eğer bir müşteri silinirse ve bu müşterinin tek bir siparişi varsa:
DELETE FROM Musteriler WHERE MusteriID = 1;
Bu durumda, müşteri tablosundan silindiği için, ilişkisel bağlantı nedeniyle Siparisler tablosundaki ilgili sipariş bilgileri de kaybolur. Bu, silme anormallisi olarak adlandırılır çünkü bir müşteri silindiğinde, müşteriye ait sipariş bilgileri de silinmiş olur.
SQL Normalizasyon (Normalization) Nedir?
SQL veritabanı normalizasyonu, veritabanı tasarımındaki bir süreçtir ve verilerin daha etkili, düzenli ve bütünlük kurallarına uygun bir şekilde depolanmasını amaçlar. Normalizasyon, veritabanlarında tekrarlanan verileri azaltarak ve bağımlılıkları yöneterek veritabanlarını daha iyi organize etmeye yardımcı olur. Normalizasyon, genellikle birinci normal form (1NF), ikinci normal form (2NF), üçüncü normal form (3NF) gibi adımları içerir.
İşte normalizasyonun temel amacı ve birkaç adımı:
Temel Amaçlar:
- Veri Bütünlüğü: Normalizasyon, veri bütünlüğünü sağlamayı amaçlar. Bu, her bir veri parçasının bir anlamı olduğu ve veritabanının bütününde tutarlı bir şekilde kullanıldığı anlamına gelir.
- Tekrarlayan Verilerin Azaltılması: Normalizasyon, tekrarlanan verilerin azaltılmasını hedefler. Bu, veritabanındaki depolama alanını etkili bir şekilde kullanmayı ve veri tutarlılığını artırmayı sağlar.
- Bağımlılıkların Yönetimi: Normalizasyon, veritabanındaki bağımlılıkları kontrol etmeyi amaçlar. Bu sayede, bir sütunun değeri değiştiğinde diğer sütunlarda oluşabilecek sorunlar minimize edilir.
Kısaca ilişkisel veritabanların da veri tekrarını engellemek ve ekleme, güncelleme, silme anormalliklerini ortadan kaldırmak için kullanılan kavramsal bir yaklaşımdır.
Normalizasyon Adımları (Genelde 1NF, 2NF, 3NF olarak adlandırılır):
- Birinci Normal Form (1NF): Her bir tablo hücresinde yalnızca bir değer bulunmalıdır. Tablodaki tüm sütunlar atomik değerlere (bölünemez) sahip olmalıdır.
- İkinci Normal Form (2NF): Tablo, birincil anahtar tarafından belirlenen herhangi bir sütunu içermelidir ve tüm sütunlar birincil anahtara bağımlı olmalıdır.
- Üçüncü Normal Form (3NF): Transitive bağımlılıkları ortadan kaldırarak, bir sütunun başka bir sütundan türetilememesi prensibini içerir.
Birinci (First) Normal Form (1NF):
Veri normalleştirmenin en temel biçimi, bir grupta tekrar eden veriş girişlerin olmamasını sağlayan 1NF modelidir.
Bir tablonun birinci normal formda olabilmesi için şu iki kritere uyması gerekmektedir:
- Tek Bir Değer: Her hücrede yalnızca bir değer bulunmalıdır. Örneğin, bir hücrede “John, Doe” gibi birden fazla değer barındırmamalıdır.
- Atomik Sütunlar: Tablodaki tüm sütunlar atomik olmalıdır, yani sütunların değerleri bölünemez olmalıdır. Örneğin, “Adres” sütunu altında “Şehir” ve “Ülke” gibi alt sütunlar olmamalıdır.
İkinci (Second) Normal Form (2NF):
Bir tablonun ikinci normal formda olabilmesi için şu iki kritere uyması gerekmektedir:
- 1. NF uygulanmalı:
- Birincil Anahtar Bağımlılığı: Tablonun her sütunu, birincil anahtarın tamamına bağımlı olmalıdır. Yani, tablonun her bir satırı benzersiz bir şekilde tanımlanmalıdır. Örneğin bir öğrenci tablosunda her öğrenci birincil anahtar olan
OgrenciID
ile tanımlanmalıdır. - Kısmi Bağımlılık Yok: Eğer tabloda bileşik bir anahtar (composite key) varsa, her sütun sadece bu anahtara bağlı olmalıdır. Başka bir deyişle, bir sütun, bileşik anahtarın bir parçası olmayan diğer sütunlara bağımlı olmamalıdır. Örneğin “Calisanlar (DepartmanID, CalisanID, Adi, Soyadi)” adında bir tablomuzun olduğunu varsayalım.
Adi
sütunu, bileşik anahtarın bir parçası olanDepartmanID
veCalisanID
‘ye bağımlıdır. Ancak, eğerAdi
sütunu sadeceDepartmanID
‘ye bağlı olsaydı, bu durum kısmi bağımlılığa yol açardı. Ancak, bu örnekte böyle bir durum söz konusu değildir; her sütun, birincil anahtara (composite key) tam bağımlıdır.
Üçüncü (Third) Normal Form (3NF):
Bir tablonun üçüncü normal formda olabilmesi için şu iki kritere uyması gerekmektedir:
- Transitive Bağımlılıklar Yok: Bir sütun, başka bir sütundan türetilememelidir. Yani, bir sütun başka bir sütunun dolaylı olarak bağımlısı olmamalıdır. Örneğin “Notlar (OgrenciID, AdiSoyadi, Sinav1, Sinav2, Ortalama)” adında bir tablomuz olduğunu varsayalım. Bu durumda,
Ortalama
sütunuSinav1
veSinav2
sütunlarından türetilmiştir. Ancak, bu durum transitive bağımlılığa neden olur çünküOrtalama
sütunu, dolaylı olarakSinav1
veSinav2
‘ye bağımlıdır. Bu durumu 3NF’ye getirmek için,Ortalama
sütununu ayrı bir tabloya taşıyabiliriz. - Bağımlılık Bağlamı Gereksiz: Tablodaki her sütun, birincil anahtara ve yalnızca birincil anahtara bağımlı olmalıdır. Eğer bir sütun başka bir aday anahtara da bağımlıysa, bu durumda bu bağımlılık gereksizdir ve bu durum ortadan kaldırılmalıdır. Örneğin “Siparisler ( SiparisID, MusteriID, UrunID, Adet, UrunFiyati, ToplamFiyat2)
Normalizasyon Örneği
Konuyu daha iyi anlamak adına bir kitap mağazası veritabanı örneği üzerinden Birinci Normal Form (1NF), İkinci Normal Form (2NF) ve Üçüncü Normal Form (3NF) adımlarını açıklayalım.
Örnek Veritabanı:
Kitaplar (ISBN, KitapAdi, Yazar, YayinEvi, Kategori, YayinYili)
Bu tabloda ISBN
(International Standard Book Number) birincil anahtardır.
Birinci Normal Form (1NF):
1NF’yi sağlamak için her hücrede tek bir değer olmalıdır.
Önceki hali:
ISBN | KitapAdi | Yazar | YayinEvi | Kategori | YayinYili
-----------|------------------|--------------|---------------------|-------------|-----------
123456789 | "Harry, Potter" | J.K. Rowling | "Publisher1, Pub2" | "Fantastik" | 2001
1NF’ye geçirilmiş hali:
ISBN | KitapAdi | Yazar | YayinEvi | Kategori | YayinYili
------------|-----------------|----------------|-------------|-------------|-----------
123456789 | "Harry Potter" | J.K. Rowling | Publisher1 | Fantastik | 2001
123456789 | "Harry Potter" | J.K. Rowling | Pub2 | Fantastik | 2001
İkinci Normal Form (2NF):
2NF’yi sağlamak için her sütun birincil anahtara tam bağımlı olmalıdır.
Önceki hali:
ISBN | KitapAdi | Yazar | YayinEvi | Kategori | YayinYili
------------|-----------------|----------------|-------------|-------------|-----------
123456789 | "Harry Potter" | J.K. Rowling | Publisher1 | Fantastik | 2001
123456789 | "Harry Potter" | J.K. Rowling | Pub2 | Fantastik | 2001
2NF’ye geçirilmiş hali:
KitapID (PK) | KitapAdi | Yazar | YayinEvi | Kategori | YayinYili
-------------|-----------------|----------------|-------------|-------------|-----------
1 | "Harry Potter" | J.K. Rowling | Publisher1 | Fantastik | 2001
2 | "Harry Potter" | J.K. Rowling | Pub2 | Fantastik | 2001
Üçüncü Normal Form (3NF):
3NF’yi sağlamak için transitive bağımlılıkları ortadan kaldırmak gerekir.
Önceki hali:
KitapID (PK) | KitapAdi | Yazar | YayinEvi | Kategori | YayinYili
-------------|-----------------|----------------|-------------|-------------|-----------
1 | "Harry Potter" | J.K. Rowling | Publisher1 | Fantastik | 2001
2 | "Harry Potter" | J.K. Rowling | Pub2 | Fantastik | 2001
3NF’ye geçirilmiş hali:
KitapID (PK) | KitapAdi | Yazar | YayinEvi (FK) | Kategori (FK) | YayinYili
-------------|-----------------|----------------|---------------|---------------|-----------
1 | "Harry Potter" | J.K. Rowling | 1 | 1 | 2001
2 | "Harry Potter" | J.K. Rowling | 2 | 1 | 2001
YayinEvi (YayinEviID (PK), YayinEviAdi)
Kategori (KategoriID (PK), KategoriAdi)
SQL Normalizasyon (Normalization) Avantajları Nedir?
Normalleştirme formlarını daha iyi anlamaya başladığınızda, verilerinizi tablolara ve seviyelere ayırırken kurallar daha net hale gelecektir. Bu tablolar daha sonra bir kuruluştaki herkesin bilgi toplamasını ve kopyalanmayan doğru verileri toplamasını kolaylaştıracaktır.
Veri Normalleştirmenin Faydaları
- Veri Bütünlüğü: Normalizasyon, veri bütünlüğünü artırır. Her veri parçasının yalnızca bir yerde depolanmasını sağlar, bu da tutarsızlık ve hataların önlenmesine yardımcı olur.
- Tekrarlanan Verilerin Azaltılması: Normalizasyon, aynı bilgilerin tekrar tekrar saklanmasını engeller. Bu, depolama alanının daha etkili kullanılmasını sağlar ve veri güncelleme işlemlerinin daha tutarlı olmasını sağlar.
- Daha İyi Performans: Normalizasyon, tablolardaki verilerin daha küçük ve spesifik parçalara ayrılmasını sağlar. Bu, sorguların daha hızlı çalışmasına ve genel performansın artmasına yardımcı olabilir.
- Ekleme, Güncelleme ve Silme Anomalilerinin Azaltılması: Normalizasyon, verileri ekleme, güncelleme ve silme işlemleri sırasında ortaya çıkabilecek anormallikleri azaltır. Veritabanındaki bir bilgiyi güncellediğinizde, bu değişikliklerin sadece ilgili tabloda yapılmasını sağlar.
- Daha İyi Yönetilebilirlik: Normalizasyon, veritabanının daha düzenli ve düzenli bir yapıya sahip olmasını sağlar. Bu, veritabanının daha iyi anlaşılmasını ve yönetilmesini kolaylaştırır.
- Bağımlılıkların Yönetimi: Normalizasyon, bağımlılıkların daha iyi yönetilmesine yardımcı olur. Bir tablodaki değişikliklerin diğer tablolar üzerinde kontrolsüz etkilerini sınırlar.
- Veritabanı Tasarımının Esnekliği: Normalizasyon, veritabanı tasarımını daha esnek hale getirir. Veri yapılarındaki değişikliklere daha iyi adapte olabilir ve gelecekteki gereksinimlere daha kolay cevap verebilir.