VERİTABANI SİSTEMLERİ - Ünite 8: Normalleştirme Özeti :

PAYLAŞ:

Ünite 8: Normalleştirme

Giriş

Veritabanı tasarımı kavramsal, mantıksal ve fiziksel olmak üzere üç aşamada gerçekleştirilir. Kavramsal modelleme aşamasında veriler çözümlenir ve veriler arasındaki ilişkiler incelenerek varlık ilişki diyagramları (Entitiy Relationship - ER) oluşturulur. Bu aşamanın devamında mantıksal modelleme ile veritabanının yönetim sistemi bağımsızlığı, teknoloji, veri depolama veya organizasyonel kısıtları sağlanır. Mantıksal tasarımda artık veriler ve ilişkiler veritabanı tabloları ve tablolar arası ilişkilere dönüştürülür. Son aşamada da veri süreklilik teknolojisinin bir sürümü ile tanımlanmış fiziksel veri modeli oluşturulur.

Veritabanı modelleme aşamalarına ilave olarak tasarımımız normalleştirme kurallarına uygun olarak düzenlenmelidir. Normalleştirme ile tablolar ve tablolar arasındaki ilişkiler tekrar düzenlenerek tutarsız bağımlılıklar kaldırılır ve artıklıklar (redundancy) en aza indirilir. İlk defa tasarlanan bir veritabanı mantıksal modelinde ilişkiler (tablolar ve tablolar arasındaki ilişki tanımları) normalleştirme kuralları ile iyi yapılandırılmış hâle getirilir. Normalleştirme kuralları iki öznitelik arasındaki kısıtlara dayanan fonksiyonel bağımlılık kavramı ile test edilir. Her aşamada uygulanan kurala Normal Form (NF) adı verilir. İlk kural uygulanıyorsa veritabanı tasarımının birinci normal formda (1NF) olduğu, ikinci kural uygulanıyorsa ikinci normal formda (2NF) olduğu şeklinde ifade edilir.

Fonksiyonel Bağımlılık

Normalleştirme fonksiyonel bağımlılıkların analizine dayalı olarak yapılır. Fonksiyonel bağımlık iki set öznitelik arasındaki kısıtlardır. Bir veritabanındaki herhangi bir tablo T ve bu tablodaki iki öznitelik A ve B olsun. Eğer A özniteliğinin değeri B özniteliğinin değerini belirliyorsa B özniteliğinin A özniteliğine bağımlı olduğu söylenir. B’nin A’ya fonksiyonel bağımlılığı ok işareti ile A?B seklinde gösterilir. Burada tanımlanan fonksiyonel bağımlılık matematiksel bağımlılık değildir. Yani B’nin değeri A’nın değerinden hesaplanmaz. Bunun yerine A’da var olan her bir değer için B’de bir değer olduğunu gösterir. Bu ilişki A özniteliği B özniteliğini belirler seklinde ifade edilir.

Kısmi Bağımlılık (Partial Dependence): Bir tabloda birincil anahtar bir veya daha fazla öznitelikten oluşabilir. Eğer birincil anahtar iki veya daha fazla öznitelikten oluşuyorsa bu tür birincil anahtarlara birleşik anahtar (composite key) adı verilir. Bu tür tablolarda anahtar olmayan öznitelik, birleşik anahtarın sadece bir kısmı ile belirleniyorsa buna kısmi bağımlılık denir. Bir veritabanında yer alan tabloda A, B, C ve D gibi toplam dört özniteliğin olduğunu varsayalım. Bu tablonun birincil anahtarı da (A, B) olsun. Bu durumda AB?CD fonksiyonel bağımlılığı yazılabilir. Bu tabloda A?C fonksiyonel bağımlılığını da varsayalım. Bu durumda C özniteliği birleşik anahtarın sadece bir kısmı olan A özniteliğine bağımlıdır. Yani C özniteliği A’ya kısmi bağımlıdır.

Geçişli Bağımlılık (Transitive Dependence): Bir tabloda yer alan bazı özniteliklerin başka bir öznitelik aracılığıyla üçüncü bir özniteliğe bağımlı olması geçişli bağımlılık olarak adlandırılır. Bir veritabanında yer alan tablonun A, B, C ve D seklinde toplam dört özniteliği olsun. Bu tabloda A birincil anahtar olsun. A?B ve B?C fonksiyonel bağımlılıklarının olduğunu varsayalım. Verilen bu iki fonksiyonel bağımlılık incelendiğinde, C özniteliğinin B özniteliği aracılığıyla A özniteliğine bağımlı olduğu görülür. Bu durum geçişli bağımlılık olup A?C fonksiyonel bağımlılığı yazılabilir. Başka bir deyişle geçişli bağımlılıkta; C özniteliği, A özniteliği ile bir diğer öznitelik B üzerinden dolaylı olarak belirlenir.

Tam Fonksiyonel Bağımlılık (Full Functional Dependence): Bir özniteliğin değeri bağlı olduğu anahtar ile benzersiz olarak belirleniyorsa bu ilişki tam bağımlılık olarak adlandırılır.

Çok Değerli Bağımlılık (Multiple Valued Dependence): Tabloda bir alandaki değerler virgülle ayrılarak oluşturulan liste veya dizi değerlerinden oluşuyorsa çok değerli bağımlılık vardır.

Döngüsel Bağımlılık (Cyclic Dependency): Döngüsel bağımlılıkta döngü kapalı halka, tekrar etme anlamında kullanılmaktadır. Veritabanında bir öznitelik A, diğer öznitelik B’ye bağımlı iken aynı zamanda B özniteliği de A’ya bağımlı ise döngüsel bağımlılık olarak adlandırılır. Döngüsel bağımlılık genelde tablolardaki iki ya da daha fazla alandan oluşan birleşik anahtarlarda oluşur.

Aykırılıklar

Veritabanında verinin değiştirilmesi sırasında mantıksal olarak bozulmaya yol açan durumlara aykırılık (anomaly) denir. Özellikle büyük veritabanlarında büyük miktardaki kayıtlar tek komut ile değiştirildiğinde veya eklendiğinde bir aykırılık oluşursa ortaya çıkan sorunun çözümü de çok zor olacaktır. Bu nedenle iyi tasarlanmış bir ilişkisel veritabanında aykırılıklar giderilmelidir. Bir veritabanında görülebilecek üç aykırılık vardır. Bunlar ekleme, silme ve güncelle-me aykırılıkları olarak sıralanabilir. Eğer bir tabloda bu aykırılıklardan biri veya birkaçı varsa bu tablo ve dolayısıyla veritabanının iyi tasarlanmadığı söylenir. Bu nedenle veritabanı tasarımları bu aykırılıkların oluşmayacağı şekilde iyileştirilmelidir.

Ekleme Aykırılığı: Veritabanında birincil ve yabancı anahtar ile ilişkilendirilmiş iki tablo olsun. Birinci tabloda kayıtların özet bilgilerinin, diğerinde ise ilgili kayıtların detay bilgilerinin tutulduğunu varsayalım. Bu iki tablo asıl ve detay tablolar olarak isimlendirilir. Asıl ve detay tablolarda, detay tabloya veri eklenirken asıl tabloya ilgili veri eklenmez ise ekleme aykırılığı oluşur.

Silme Aykırılığı: Silme aykırılığı, asıl ve detay ilişkili tablolarda, kayıtların detay bilgilerini silmeden asıl tablodaki satırlarının silinmesi ile oluşur. Önceki ünitelerde anlatılmış olan “cascade delete” SQL komutu kullanılması hâlinde bu aykırılık oluşmayacaktır. “Cascade” komutu öncelikle detay tablolardaki kayıtları siler daha sonra detay tabloların bağlı olduğu asıl tablodaki kaydı siler.

Güncelleme Aykırılığı: Güncelleme aykırılığı silme aykırılığına benzer. Asıl ve detay ilişkili tablolarda güncelleme yaparken asıl tablodaki veri yok edilerek detay tablosundaki veriler ilişkisiz bırakılmamalıdır. Bu aykırılığı önlemek için birincil anahtar değerinde güncelleme yaparken detay tablolarda da ilişkili yabancı anahtarlar sırasıyla (cascade) güncellenmelidir.

Normalleştirme

Veritabanı tasarlarken kullanılan tablolar ve tablolar arası ilişkiler ile ortaya konulan modelin iyi bir tasarım olup olmadığına karar vermek gerekir. Eğer tablolar veya aralarındaki ilişkiler iyi tanımlanmamış ise daha küçük tablolara bölünmeli ve tablolar arası yeni ilişkiler oluşturulmalıdır. Normal formlar bu iyileştirme işlemlerinin yapılması için rehberlik yapmak üzere tanımlanmıştır. Eğer tanımlanmış olan ilişkisel model bu normal formlar-dan herhangi birine uyuyorsa modelden ilgili hatalar giderilmiş demektir. Normalleştirme her biri bir normal forma karşılık gelecek şekilde aşamalı olarak gerçekleştirilir.

Normalleştirmenin amaçları:

  1. Veri arıklığını (redundancy) minimum yapmak. Böylece aykırılıklar önlenmiş ve fiziksel veri saklama alanından tasarruf edilmiş olur.
  2. Veri bütünlüğünü sağlayan kısıtların uygulamasını basitleştirmek. Eğer bir alan tanımı birden fazla tabloda var ise farklı tablolardaki bu alanlar bir süre sonra birbirinden faklı değerler içermeye başlayacaktır. Bu tip aynı alanın farklı tablolarda tekrar tanımının önlenmesi gerekir. Ayrıca bir tabloda aynı bilgiler yinelenen satırlarda saklanırsa ekleme, silme ve güncelleme aykırılıklarına sebep olur ve veri bütünlüğünü korunamaz. Aykırılığa sebep olan ilişkiler tekrar yapılandırılmalıdır.
  3. Veri islemeyi (ekleme, güncelleme ve silme) daha basit hâle getirmek. Daha basit SQL komutları daha yüksek performansta veriye erişimi sağlayabilecektir.
  4. Gerçek varlık ve ilişkileri daha iyi temsil edecek veritabanı modeli tasarımını gerçekleştirmek ve ilerideki geliştirmeler için sağlam bir taban oluşturmak.

Normalleştirmenin aşamaları:

  1. Normal Form (1st Normal Form - 1NF) Tablolar ilişkilendirilebilir şekilde tasarlanır ve çok değerli öznitelikler kaldırılır. Tablonun her bir satır ve sütun kesişimindi atomik değer olacak şekilde tablo tekrar yapılandırılır. Birden fazla bilgi tek bir sütunda tutulamaz. Tekrarlanan veriler kaldırılır. 1NF’de bir tablodaki tüm alanlar birincil anahtar (birleşik anahtar olabilir) ile doğrudan ya da dolaylı benzersiz olarak belirlenebilir.
  2. Normal Form (2nd Normal Form - 2NF) Bu aşamada kısmi fonksiyonel bağımlılıklar kaldırılır. Tüm alanlar birincil anahtar ile belirlenebilir olmalıdır. Bu aşamada asıl tablodaki birincil anahtara bağlı olan ancak tekrar eden alanlar yeni bir tabloya taşınır. Asıl tablo ile yeni tablo arasında çoklu bir ilişki kurulur. Yeni tablo tekrar eden alanları tek kayıt altında birincil anahtar ile belirler. Yeni tablodaki birincil anahtar asıl tabloya yabancı anahtar olarak yerleştirilir. Asıl tabloya yerleştirilen yabancı anahtar aynı tablodaki birincil anahtarın bir parçası değildir.
  3. Normal Form (3th Normal Form - 3NF) Geçişli fonksiyonel bağımlılıklar kaldırılır. Yani birincil anahtar tarafından dolaylı olarak belirlenen alanlar yok edilir. Geçişli fonksiyonel bağımlılığı kaldırmak için asıl tablodaki birincil anahtara dolaylı bağımlı alanlar yeni bir tabloya taşınır. Boyce-Codd Normal Form (BCNF) Fonksiyonel bağımlılıktan geri kalan tüm aykırılıklar kaldırılır. Bir tablo 3NF’de ise ve her belirleyici anahtar olarak tanımlandıysa ilgili tablo BCNF formunda denir. Bu tanıma göre Eğer bir tablo BCNF ise bu tablo aynı zamanda 3NF’dir. Ama tersi doğru değildir.
  4. Normal Form (4th Normal Form - 4NF) Çok değerli hiç bir bağımlılık kalmaz. Birincil anahtar olan alanlar ile diğer alanlar arasındaki her bir bağımsız bire-çoklu ilişki için ayrı tablo oluşturmak gerekir. Tekrarları önlemek için her tablo mümkün olduğunca küçük parçalara bölünür.
  5. Normal Form (5th Normal Form - 5NF) Bu aşamada döngüsel fonksiyonel bağımlılıklar ve kalan tüm aykırılıklar kaldırılır. Projeksiyon Normal Form (PJNF) olarak adlandırılır. 4NF’de kaldırılmamış olan tekrarlamalar daha küçük tablolara bölünerek kaldırılır. Etki Alanı Anahtarı Normal Formu (Domain Key Normal Form-DKNF) Bu asama bir dönüşüm olmak yerine en üst seviyede normaliz edilmiş veritabanı kavramsal modeli seviyesinin ölçüsüdür. Normal formlar her aşamada daha fazla kısıt uygulamaktadır. Öncelikle 1nci Normal Form ile tablolar ilişkisel yapıya dönüştürülür ve izleyen aşamalarda sırasıyla kısmi ve geçişli fonksiyonel bağımlılıklar ve aykırılıklar mantıksal veritabanı tasarım modelinden kaldırılır. Veritabanı normalleştirmesinde önce 1NF daha sonra 2NF olmak üzere her asama sırayla uygulanır. Herhangi bir asama atlanmaz ve sıralama değiştirilmez. Genel olarak normalleştirme tekrarlanan veriyi kaldırarak verideki artıklı grupları minimize eder. Bunun sonucu olarak aykırılıkların kaldırıldığı daha iyi bir tasarım ve fiziksel saklama alanının daha etkin kullanımı gerçekleştirilmiş olur. Günümüz modern ilişkisel veritabanı uygulamalarında 3NF’den sonraki normalleştirme aşamaları genellikle kullanılmaz. 3NF’nin ilerisindeki normalleştirme adımları tasarlanan veritabanında çok fazla tablo üretilmesine sebep olur. Dolayısı ile de SQL komutlarındaki bitişme (join) işlem inde çok fazla tablo kullanılır. Daha büyük bitişmeler daha karmaşık sorgulara, daha karmaşık sorgular da sistemde performans düşüşüne sebep olur. Genelde iyi performans, ilişkisel veritabanı tasarımındaki ilişkileri mükemmelleştirmek için yapılan daha küçük tablolara bölmeye (4NF, 5NF) tercih edilir.

Normal Formlar

İlk aşamada varlıklar tüm öznitelikleri içerecek şekilde bir tabloda ifade edilir. Örnek ver iler tablonun satırlarına kaydedilir. Veri tekrarlarına izin verilir. Bu aşamadaki veritabanı modeli Sıfırıncı Normal Formda (0NF) kabul edilir. Sekil 8.2’de çok değerli alanlar ile oluşturulan 0NF’de tablo gösterilmişti. Benzer şekilde her satırda bir satış bilgisini saklamak üzere çok değerli alanlar yerine her bir ürün için ayrı alanlar kullanılırsa Sekil 8.7’de verilen tablo elde edilir. Bu tablo da yine 0NF’dedir ve ilişkisel yapıda değildir. Farklı ürünler in kendine ait alanlarda tutulması hâlinde tablo içinde çok fazla Null değer oluşmaktadır. Null değerler tabloda gri renkte işaretlenmiştir. Satış bilgilerinin bu şekilde kaydedilmesi fiziksel saklama alanının bos yere kullanılmasına ve her bir ürünü sorgulamak için sorguda farklı bitişme kullanılmasına sebep olur.

Birinci Normal Form (1NF): Birinci normal formda çok değerli ve çok parçalı öznitelikler ve tekrar eden gruplar kaldırılır. Veritabanı normalleştirmesinin ilk aşamasında uygulanan kurallar şunlardır:

  1. Tekrar eden gruplar kaldırılır.
  2. Birincil anahtar tanımlanır. Birincil anahtar benzersiz olup tekrarlı değerlere izin vermez.
  3. Bütün diğer alanlar birincil anahtar ile doğrudan ya da dolaylı benzersiz olarak belirlenebilir.
  4. Her bir alan atomik değer içermelidir.
  5. Bir alandaki değerler aynı veritipinde olmalıdır.

1NF’de tekrar eden alanlar yeni tablo oluşturularak kaldırılır. Sekil 8.7’de satıştaki ürünlerin tamamı aynı satırında gösterilmektedir. Bu durumda her bir satış kaydında, satıs ile ilgili olmayan ürüne ait alanlar bos kalacak (null değer alır) ve gereksiz yere fizik-sel saklama ortamında yer tutacaktır. Bu nedenle 1NF’ye ihtiyaç vardır. Burada satışlar ve satılan ürünler asıl detay tablolara bire çok ilişki ile bölünmelidir.

1NF sonucunda elde edilen tabloda birincil anahtara kısmi ve geçişli bağımlılıklar olabileceği için ekleme, silme ve güncelleme aykırılıkları ile karşılaşılabilir.

  1. Ekleme Aykırılığı: Yeni bir satış bilgisinin eklenmesi için müşteriye ve satılan ürüne ait tedarikçi bilgileri önceden var olsa da tekrar girilmelidir. Benzer şekilde ilişkili tablolarda veri bütünlüğü korunacak şekilde bilgiler her bir tabloya kaydedilmelidir.
  2. Silme Aykırılığı: Müşteri bilgisi Satışlar tablosu ile birlikte tutulduğu için ilgili müşteriye ait tüm satışların silinmesi hâlinde müşteri bilgisi de kaybedilmektedir. Benzer şekilde kaldırılacak bilgi veri bütünlüğü korunacak şekilde tablolardan doğru sıra ile (cascade) silinmelidir.
  3. Güncelleme Aykırılığı: Ürüne ait bir bilgi değiştirilmek istendiğinde birden fazla kaydın güncellenmesi gerekecektir. Bu sorun çok fazla verinin olduğu veritabanlarında performans düşüklüğüne ve tüm alanların güncellenememesi hâlinde de veri bütünlüğünün bozulmasına sebep olacaktır.

İkinci Normal Form (2NF): İkincil normal form 2NF’de tekrar eden değerler yeni tablolara taşınmaktadır. 2NF kuralları aşağıdadır:

  1. Tablolar 1NF olmalıdır.
  2. Tüm anahtar olmayan alanlar birincil anahtara tam fonksiyonel bağımlı olmalıdır.
  3. Kısmi bağımlılıklar kaldırılmalıdır. Önceden de bahsedildiği gibi kısmi bağımlılık fonksiyonel bağımlılığın bir özel durumu olup bir alanın birleşik anahtarın bir parçasına tam bağımlı olması demektir. Kısaca birincil anahtara kısmi bağımlı alanlar yeni bir tablo oluşturarak taşınmalıdır.

2NF sonucunda elde edilen tablolarda kısmi bağımlılıklar kaldırıldığı için güncelleme aykırılığı çözülür. Ancak birincil anahtara geçişli bağımlılıklar olabileceği için satır ekleme ve satır silme aykırılıkları ile karşılaşılabilir.

  1. Ekleme Aykırılığı: Yeni bir ürün bilgisinin eklenmesi için satılan ürüne ait tedarikçi bilgileri önceden var olsa da tekrar girilmelidir.
  2. Silme Aykırılığı: Tedarikçi bilgisi ürün ile birlikte tutulduğu için ilgili ürüne ait tüm kayıtların silinmesi hâlinde tedarikçi bilgisi de kaybedilmektedir.

Üçüncü Normal Form (3NF): Üçüncü Normal Form (3NF) Normalleştirmenin bu aşamasında 2NF’de karşılaşılan aykırılıkları çözmek için geçişli bağımlılıklar da kaldırılır. 3NF kuralları:

  1. Tablolar 2NF olmalıdır.
  2. Geçişli bağımlılıklar kaldırılmalıdır. Geçişli bağımlılıkta bir alan birincil anahtar ile ikinci bir alan üzerinden dolaylı olarak belirlenir.
  3. Ayrılan alanlar için yeni bir tablo oluşturulur. 3NF’de bir tablodaki anahtar olamayan tüm alanlar birincil anahtara bağlı olmak zorundadır.

Farklı durumlarda 3NF’nin uygulanması izleyen kesimde örneklerle açıklanacaktır.

3NF’de Çoka Çok İlişki Durumu: İki tablo arasında çoka çok ilişki oluşursa bu tablolarda yapılacak sorgu sonucunda tek bir satır yerine çoklu satır sonuç gelecektir. Bu sorunu gidermek için yeni bir tablo oluşturulur ve çoka çok ilişkili iki tablonun birincil anahtarları bu tabloya yabancı anahtar olarak eklenir.

3NF’de Geçişli Bağımlılık Durumu: Geçişli bağımlılık durumunun çözümü 3NF’nin en yaygın kullanımındandır. Geçişli bağımlılık birincil anahtara dolaylı olarak bağlı olan alanlardan oluşur.

3NF’de Hesaplanmış Değerleri Saklayan Alanların Durumu: 3NF’de aynı tablodan hesaplanarak bulunan değerler birincil anahtara geçişli olarak bağımlı olduklarından kaldırılır. Değer hesaplanabildiği için yeni tablo oluşturmaya gerek kalmaz.

BCNF,4NF ve 5NF

Günümüzde modern ilişkisel veritabanı modellerinde genelde 3. normal formdan sonrası genelde uygulanmaz. 3NF üzeri normalleştirmeler veritabanında çok fazla tablo ve ilişki oluşturur. Bunun sonucunda da uygulamada oluşturulacak SQL bitişmeleri çok karmaşık olur. Karmaşık bitişmeler ise sorguların tamamlanma sürelerinin uzamasına sebep olur. Dolayısıyla uygulamada veriye erişimde performans düşüşleri yaşanır. Bu nedenle uygulamacılar tabloları daha küçük parçalara bölmek yerine, 3NF veritabanı modeli ile daha az karmaşık bitişme kullanan SQL komutları kullanır ve olası performans düşüşlerinin önüne geçmiş olur.