İlişkisel Veri Tabanı Şema Tasarımı İçin Algoritmalar
Ayrıştırılan her bir ilişkinin yüksek dereceli normal formda olması o tasarımın iyi olduğunu garanti etmez. İyi bir tasarım için normal formun yanında başka özelliklere de bakmak gerekir. Bu özellikleri aşağıdaki algoritmalarla test edebiliriz.
Ayrıştırma ve Bağımlılığın Korunması;
Orijinal ilişkideki her bir bağımlılığın ayrıştırılmış ilişkide de var olmasını isteriz. Çünkü F’deki her bağımlılık veri tabanı üzerindeki bir kısıtı yansıtır. Ayrıştırılan ilişkilerdeki bağımlılıkların toplamının kapaması (closure) orijinal ilişkideki bağımlılıkların kapamasını (closure) verirse bu yeterli olacaktır. Eğer bir ayrıştırılmış şema başlangıçtaki bazı bağımlılıkları içermiyorsa, bu ayrıştırmanın bağımlılıkları koruyan bir ayrıştırma olmadığı anlamına gelir. Kısaca, eğer
(((PF(R1)) U (PF(R2)) U … U (PF(Rm)) )+ = F+
ise R’nin D=(R1, R2, …, Rm) ayrıştırması F bağımlılık kümesine göre bağımlılığı koruyucu bir ayrıştırmadır denir. Burada F+ tüm verilmiş ve bağımlılık kuralları kullanılarak elde edilebilecek fonksiyonel bağımlılıkların kapamasını (closure) verir.
Ayrıştırma ve Kayıpsız Birleştirme
R={sicil_no, isim, proj_no, proj_ismi, proj_adr, saat}
- R’yi önce R1 ve R2 olarak iki yeni ilişkiye ayrıştıralım.
- Bir R ilişkisinin ayrıştırmasının D={R1, R2} olduğunu varsayalım. Eğer,
(R1 R2) –> (R1 – R2) F+’nin içinde ise ya da
(R1 R2) –> (R2 – R1) F+’nin içinde ise
bu ayrıştırma kayıpsız birleştirmedir.
Görüldüğü üzere sadece ayrıştırılmış iki ilişki varsa bu kural uygulanabilir. - D={R1, R2}
R1 = ŞİRKET_ADR = {Sicil_no,isim, proj_adr}
R2 = ŞİRKET_PROJ1 = {sicil_no, proj_ismi, proj_no, saat}
Verilen fonksiyonel bağımlılıkları F ile gösterelim.
F = {sicil_no –> isim; proj_no –> {proj_ismi, proj_adr}; {sicil_no, proj_no} –> saat}Sicil_no İsim Proj_no Proj_ismi Proj_adr Saat R1 a1 a2 b13 b14 a5 b16 R2 a1 a2 a3 a4 b25 a6 - Eğer ayrıştırma üç değişik ilişki ile sonuçlanmışsa,
- R= {sicil_no, isim, proj_no, proj_ismi, proj_adr, saat}
D= {R1, R2, R3}
R1 = ŞİRKET = {sicil_no, isim}
R2 = PROJE = {proj_no, proj_ismi, proj_adr}
R3 = ÇALIŞAN = {sicil_no, proj_no, saat}
F = {sicil_no –> isim; proj_no –> {proj_ismi, proj_adr}; {sicil_no, proj_no} –> saat}Sicil_no
İsim
Proj_no
Proj_ismi
Proj_adr
Saat
R1
a1
a2
b13
b14
b15
b16
R2
b21
b22
a3
a4
a5
b26
R3
a1
b32
a3
b34
b35
a6
(Algoritmanın girdisi olan başlangıcındaki orijinal matris) Aşağıda özetlediğimiz algoritmayı uygulayarak bu ayrıştırmanın kayıpsız olup olmadığını anlayabiliriz.
Sicil_no
İsim
Proj_no
Proj_ismi
Proj_adr
Saat
R1
a1
a2
b13
b14
b15
b16
R2
B21
b22
a3
a4
a5
b26
R3
a1
b32 a2
a3
b34 a4
b35 a5
a6