Bölüm 7: İlşikisel Veritabanı Tasarımı ve Normalizasyon
Tablo Birliştirme nasıl olmalıdır? borrower ve loan tablolarını birliştirmeyi deneyelim bor_loan = (customer_id, loan_number, amount ) Bu durumda L-100 borcuna ait borç miktarı gereksiz şekilde tekrarlanıyor.
Tablo Birliştirme nasıl olmalıdır? loan_branch ve loan tablolarını birliştirmeyi deneyelim loan_amt_br = (loan_number, amount, branch_name) Bu durumda gereksiz veri tekrarı yoktur. Bu birliştirme doğru bir birleştirme olur.
Daha küçük tablolara bölme Daha küçük tablolara böldükten sonra elde edilen tablolar doğal birleştirme yöntemi ile birleştirildiğinde orijinal tablo elde edilebliyorsa bu birleştirme «kayıpsız» birleştirme olarak adlandırılır. Tablolar sadece kayıpsız birleştirme sonucu verecek şekilde bölünmelidirler.
Normalizasyon Normalizasyon, veritabanı tasarım aşamasında veri tekrarını, veri kaybını veya veri yetersizliğini önlemek için kullanılır. Tabloların oluşturulması, tablolar arasında artıklığı ve tutarsız bağımlılığı ortadan kaldırmak nornalizasyonun temel amacıdır. Normalizayonun amaçları: Veri bütünlüğünü sağlamak: eğer bir sütun için gereksiz veri tekrarı var ise, bu sütun bir süre sonra birbirinden farklı değerler içermeye başlayacaktır. Uygulamadan bağımsızlık: hazırlanacak ilişkisel model kullanılacak uygulamaya göre değil içereceği veriye göre hazıralanmalıdır. Performans artışı: Tam olarak normalleştirilecek veritabanı veri tekrarını en aza indireceğinden kullanılan disk alanı ve veritabanı boyutu azalacaktır. Böylece veritabanı işlemleri daha hızlı yapılabilecektir.
Normalizasyon Veritabanı normalizasyonu için kullanılan birkaç kural bulunmaktadır. Her kurala «Normal Form» adı verilir. Birinci (1NF), ikinci 2NF), üçüncü (3NF), Boyce-Codd (BCNF), dördüncü(4NF), beşinci normal (5NF) formlar vardır. Üst normal formlar alt normal formları kapsamaktadır 3NF, 2NF ve 1NF kurallarını kapsar (ama tersi doğru değildir) Çoğu uygulama için 3NF kuralları yeterlidir.
1. Normal Form (1NF) Birden fazla veri tek sütunda olamaz. Bir alan(sütun) içerisindeki bilgi özel karakterlerle ayrılarak tutulmamalıdır. Bir tablonun 1NF olabilmesi için o tabloyu oluşturan sütunların 1NF olması gerekir. 1Nf olmayan tablolarda veri tekrarı kaçınılmazdır. Genel olarak tüm tabloların en az 1NF kuralına uygun olduğunu varsayarız. Ör: Ders kodu sütununda CS0012 veya EE1127 gibi verilerin tutulması bu sütunun (ve de dolayısı ile tablonun) 1NF kuralın uymamasına neden olur. Ör: Not sütununda 80, 90, 75 gibi birden fazla değer tutulması bu sütunun (ve de dolayısı ile tablonun) 1NF kuralın uymamasına neden olur.
Amaç Amaç: Bir R tablosunun «iyi» formda olup olmadığına karar vermek. R tablosu «iyi» formda değil ise tabloyu {R1, R2, ..., Rn} ‘den oluşan iy tablolar kümesine bölmek gerekir. Bu bölünme sonucunda; Ortaya çıkan tüm tablolar «iyi» form da olmalıdr Bölünme kayıpsız-birleştirme (lossless-join) kuralına uygun şekilde yapılmalıdır. (daha sonra anlatılacaktır) Tercihen bölünme «fonksiyonel bağımlılığı koruyan» şeklinde olmalıdır. (daha sonra anlatılacaktır) Bu kuram Fonksiyonel Bağımlılık üzerine kuruludur.
Fonksiyonel Bağımlılık R kümesi(tablosu) X ve Y kümelerinden oluşsun Eğer X nitelik kümesinin değerleri Y nitelik kümesinin değerlerini belirliyorsa, Y niteliği X niteliğine Fonksiyonel Bağımlıdır denir Gösterliş: X Y X değerlerini biliyorsak Y değerlerini bulabiliriz !!!!
Fonksiyonel Bağımlılık (devam) Ör: R(A,B) tablosu için aşağıdaki somutlaşan örneği (instance) inceleyelim: A B fonksiyonel bağımlılığı sağlanmıyor ancak B A sağlanıyor. A B 4 1 5 3 7 Not: Bir somutlaşan örneğin bir zaman diliminde bir fonksiyonel bağımlılığı sağlıyor olması bu fonksiyonel bağımlılığın ilgili tablo için her zaman sağlandığı anlamına gelmez. Ör: Yukardaki somutlaşan örnek daha sonraki bir anda yandaki duruma gelir ise BA fonksiyonel bağımlılığı artık geçerli değildir. A B 4 1 5 7
Fonksiyonel Bağımlılık ve Anahtarlar Fonksiyonel bağımlılık anahtar konseptini genişletilmiş biçimidir. K R fonksiyonel bağımlılığının geçerli ise K nitelik kümesi R tablosu için süper anahtar oluşturur K nin R tablosu için aday anahtar oluşturabilmesi için: K R, fonksiyonel bağımlılığının geçerli olması ve Hiçbir K nitelik kümesi için R fonksiyonel bağımlılığının geçerli olmaması gerekir.
Apaçık Fonksiyonel Bağımlılık Bir fonksiyonel bağımlılık bir tablonun tüm somutlaşan örnekleri için geçerli ise apaçık fonksiyonel bağımlılık olarak tanımlanır. Ör: musteri_ismi, borc_no musteri_ismi musteri_ismi musteri_ismi Genel olarak fonksiyonel bağımlılığında durumu var ise apaçık tır. (yani fonksiyonel bağımlılığı oluşturan sağ taraftaki nitelik kümesi sol tarafttaki nitelik kümesinin alt kümesidir)
Fonksiyonel Bağımlılık kümesinin Kaplaması (Closure) Fonksiyonel bağımlılıklardan oluşan bir F kümesi verilmiş olsun. Bu kümedeki fonksiyonel bağımlılıkları kullanarak yeni fonksiyonel bağımlılıklar türetmek mümkün olabilir. Ör: A B ve B C, sağlanmış ise A C bağımlılığının sağlanması mantıksal olarak gerekli olur. F kümesi tarafından mantıksal olarak gerekli gösterilen tüm fonksiyonel bağımlılıklar kümesine F’in kaplaması denir. Gösterriliş: F+. F+ her durumda F’in üst kümesidir.
Fonksiyonel Bağımlılık kümesinin Kaplaması Armstrong Aksiyomlarını F+ ‘ ın tüm elemanlarını bulabiliriz. ise, sağlanır (yansıma) sağlanıyorsa, sağlanır (ekleme) ve sağlanıyorsa sağlanır (geçişme) Aksiyomlara ek olarak F+’ ı elde etmek için kullanılabilecek 3 ek kural daha vardır. ve sağlanıyorsa, sağlanır (birleşme) sağlanıyorsa, ve sağlanır (bölünme) ve sağlanıyorsa, sağlanır (sözde geçişme) Not: Ek kurallar aksiyomlar kullanılarak türetilirler
Örnek R = (A, B, C, G, H, I) F = { A B A C CG H CG I B H} F+’ kümesininnın bazı elemanları: A H A B ve B H kullanılarak geçişme AG I A C ‘ye G ekleme sonucu AG CG elde edilir sonrasında CG I ile sözde geçişme kullanılır CG HI CG I her iki tarafına CG eklenerek CG CGI elde edilir CG H to her iki tarafına I eklenerek CGI HI elde edilir Daha sonra geçişme uygulanır
Nitelik Kümelerinin Kaplaması (Attribute closure) Verilen bir a nitelik kümesi için a kullanılarak F kümesinden fonksiyonel olarak elde edilen nitelik kümesine a ‘nın kaplaması denir.(Gösteriliş: a+) a+ hesaplama algoritması sonuç:= a; while (sonuç değişir) do her F için begin if sonuç then sonuç := sonuç end end
Nitelik Kaplaması (Örnek) R = (A, B, C, G, H, I) F = {A B A C CG H CG I B H} (AG)+ 1. sonuç= AG 2. sonuç= ABG (A B) 3. sonuç= ABCG (A C ) 4. sonuç= ABCGH (CG H ve CG AGBC) 5. sonuç= ABCGHI (CG I ve CG AGBCH) AG aday anahtarmı? AG super anahtarmı? AG R sağlanıyormu? == (AG)+ R ? Evet AG ‘nin herhangi bir alt kümesi super anahtarmı? ( (A)+ ve(G)+ hesaplayıp kontrol et) A R sağlanıyormu? == (A)+ R ? (A+=ABCH hayır!) G R? Sağlanıyormu? == (G)+ R ? ((G+=G hayır!)
Nitelik Kaplamasının Kullanımı Super anahtar testi için: nın super anahtar olup olmadığını bulmak için +, hesaplanır. + R tablosundaki tüm nitelikleri içeriyorsa süper anahtardır. Fonksiyonel bağımlılık testi için: nın sağlanıp sağlanmadığını bulmak için (bir başka deyişle F+ nın elemanı olup olmadığını bulmak için) + mı diye kontro ederiz. + ’yı hesaplayıp yı içerip içermediğine bakarız İçeriyorsa sağlanıyordur. F’in kaplama kümesini bulmak için. Her bir R, için + hesaplanır Her bir S +, S bir fonksiyonel bağımlılık tanımlanır.
F kümesinin Doğal Kaplaması - Fc F kümesindeki fonkksiyonel bağımlılıklara eşdeğer en küçük fonksiyonel bağımlılık içeren kümeye, F kümesinin doğal kaplaması (Fc) denir. Fc’nin özellikleri: Fc deki hiçbir fonksiyonel bağımlılık «gereksiz» nitelik içermez. Fc ‘deki her bir fonksiyonel bağımlılığın sol tarafı birbirinden farklıdır. Fc hesaplama algoritması: repeat F kümesindeki her bir fonksiyonel bağımlılığa birleştirme kuralı uygula 1 1 and 1 2 with 1 1 2 Her bir fonksiyonek bağımlılıktan gereksiz tüm nitelikleri kaldır until F daha fazla değişmez
Gereksiz Nitelik bulma F kümesinde şeklinde bir fonksiyonel bağımlılığı ele alalım Sol tarafta () veya sağ tarafta () gereksiz nitelikleri bulmak için iki ayrı test vardır. (Sol taraf testi) A gereksizmi? F kümesini kullanarak ({} – A)+ hesapla ({} – A)+ kaplamsı kümesindeki tüm nitelikleri içeriyormu? İçeriyorsa A niteliği gereksizdir (Sağ taraf testi) A gereksizmi? F’ = (F – { }) { ( – A)}, kümesini kullanarak + hesapla + kaplaması A niteliğini içeriyormu?
Kayıpsız Birleştirme Bölünmesi R = (R1, R2) şeklindeki bir bölünmenin kayıpsız birleştirme özelliğine sahip olabilmesi için gerekli koşul: r = R1 (r ) R2 (r ) Bölünmenin kayıpsız olabilmesi için R1 R2 R1 R1 R2 R2 fonksiyonel bağımlılıklarından en az bir tanesinin sağlanması gerekir. Bir başka deyişle; R1 R2 kümesindeki niteliklerin R1 veya R2 kümesin süper anahtarı olması gerekir. (Not: süper anahtarı kontrol etmek için nitelik kapsama kümesini hesaplamak gerekebilir)
Fonksiyonel Bağımlılığın Korunması R = (R1, R2,.....Rn ) şeklindeki bir bölünmeyi ele alalım Her bir Fi kümesi sadece Ri deki nitelikler kullanılarak yazılabilecek F + ‘in alt kümeleri olsun Fonksiyonel Bağımlılığın Korunması için gerekli koşul: (F1 F2 … Fn )+ = F +
Örnek R = (A, B, C) F = {A B, B C) İki farklı şekilde bölünebilir. R1 = (A, B), R2 = (B, C) Kayıpsız-birleştirme özellikli bölünmedir R1 R2 = {B} ve B BC Fonksiyonel bağımlılık korunur R1 = (A, B), R2 = (A, C) R1 R2 = {A} ve A AB Fonksiyonel bağımlılık korunmaz (B C bağımlılığı R1 R2 bulunmadan elde edilemez)
Boyce-Codd Normal Form R tablosunun F kümesindeki fonksiyonel bağımlılıklara dayalı olarak BCNF, olabilmesi için F+ deki ( R and R) cinsinden tüm fonksiyonel bağımlılıkların aşağıdaki koşullardan en az birini sağlaması gerekir. bağımlılığı apaçıktır (yani, ) , R tablosunun süper anahtarıdır
Tabloların BCNF ‘na uygun bölünmesi Bir R tablosu için F+ de yer alan fonksiyonel bağımlılığının her 2 BCNF koşulunu da sağlamadığını varsayalım; Bu durumda R tablosu aşağıdalkine uygun olarak R1 ve R2 tablolarına bölünür R1= (U ) R2= ( R - ( - ) ) Elde edilen R1 ve R2 tabloları BCNF’i sağlamıyorsa, sağlamayan tablo veya tablolar tekrardan bölünür. Not: BCNF bölünme yöntemi kullanılarak elde edilen tüm Ri tabloları BCNF koşulunu sağlar ve bölünme her zaman kayıpsız birleşme koşuluna uygundur Örnek: musteri_borc = ( musteri_id, borc_no, borc_miktari ) borc_no borc_miktari (F kümesinde var olan fonk. bağ.) = borc_no = borc_miktari Bu durumda; R1= (U ) = ( borc_no, borc_miktari ) R2= ( R - ( - ) ) = ( musteri_id, borc_no )
Örnek R = (A, B, C ) F = {A B B C} Süper anahtar= {A} R, BCNF ‘i sağlamıyor. B C her 2 koşuluda sağlamıyor! R’nin BCNF bölünmeye uygun olarak R1 = (A, B), R2 = (B, C) şeklinde bölünmesi sonucunda; R1 ve R2 BCNF’ i sağlıyor Kayıpsız-birleştirme özellikli bölünmedir Fonksiyonel bağımlılık korunur
Tabloların BCNF ‘na uygun bölünmesi Başlangıçtaki R tablosunun BCNF’ i sağlayıp sağlamadığını bulmak için sadece F kümesindeki fonksiyonel bağımlıkları test etmek yeterlidir. Ancak BCNF yöntemine uygun olarak yapılan bölünmeden sonra elde edilen R1, R2 kümelerinin BCNF’i sağlayıp sağlamadığını bulmak için sadece F kümesindeki fonksiyonel bağımlıkları test etmek yeterli değildrir Bu durumda F+ tüm bağımlıklarını test etmek gerekir.
BCNF ve Üçüncü Normal Form(3NF) BCNF koşuluna uygun bölünme sonucunda ortya çıkan tablolar her zaman fonksiyonel bağımlılığı koruyacağından, fonksiyonel bağımlılığı korunmasının zorunlu (veya tercih edilen) olduğu durumlarda daha zayıf olan bir başka normal form olan üçüncü normal form (3NF)’ u kullanabiliriz. 3NF kuralına uyan tablolarda bazı gereksiz veri tekrarları olabilmesine rağmen, 3NF’ e uygun bölünme sonucunda elde edilen tablolar her zaman fonksiyonel bağımlılığı korur ve kayıpsız birleşmşme koşulunu da sağlar.
Third Normal Form Bir R tablosunun (3NF) ‘i sağlayabilmesi için F+ de yer alan şeklinde tüm fonksiyıonel bağımlılıkların aşağıdaki koşullardan en az birini sağlaması gerekir. Üçüncü koşul, fonksiyonel bağımlılığın korunması koşulunun sağlanması adına BCNF’ ten verilen bir esnemedir. bağımlılığı apaçıktır (yani, ) , R tablosunun süper anahtarıdır – kümesindeki herbir A nitaliği R kümesi için var olan aday anahtalardan en az birisinde bulunmalıdır.
3NF Decomposition Algorithm -11- i := 0; for each Fc de yer alan türünden herbir fonksiyonel bağımlılık için do if hiçbir Rj, 1 j i tablosu ‘yı içermiyorsa then begin i := i + 1; Ri := end if hiçbir Rj, 1 j i, R tablosun hiçbir anahtar niteliğini içermiyorsa then begin i := i + 1; Ri := R tablosu için tanımlanmış anahtar niteliklerden herhangi biri; end return (R1, R2, ..., Ri) Not: 3NF Bölünme her zaman bağımlılığı korur ve kayıpsız birleşmye uygun bir bölünmedir.
3NF Örnek Tablo R: R = (J, K, L ) F = {JK L, L K } İki aday anahtar: JK ve JL R tablosu 3NF’ sağlıyor (kontrol et) JK L JK süper anahtardır L K K niteliği, R için tanımlanmış aday anahtarlardan birinde içerilmiş (JK) (unutmayınız ki K-L=K)
Veritabanı Tasarımı Hedefleri İlişkisel bir veri tabanı tasarlanırken aşağıdaki hedefler gözönünde tutulur: BCNF. Kayıpsız Birleşmeye uygun Bölünme Fonksiyonel Bağımlılığın Korunması Yukarıdakilerin tamamının elde edilmesinin mükün olmadığı durumlarda Ya Fonksiyonel bağımlığın korunması hedefinden vazgeçilir Ya da 3NF kullanılarak bazı gereksiz veri tekrarlarına izin verilir.