Kötü tasarım, fonksiyonel bağımlılıklar ve closure
Tek tabloya her şeyi koymanın neden anomali ürettiğini, fonksiyonel bağımlılığı, Armstrong aksiyomlarını ve closure ile anahtar bulmayı öğrenirsin. Normalizasyon sorularının hepsi bu hesaplara dayanır.
Normalizasyon (normalization) bölümünün ilk haftası. Vizeden sonraki sınavda en garantili puanlar buradan gelir, çünkü soruların çoğu mekanik: closure hesapla, anahtar bul, FD türet. Bu sayfadaki üç beceri bir sonraki iki haftanın (normal formlar, ayrıştırma) temeli:
- Tek büyük tablonun neden sorun çıkardığını anomalilerle açıklamak.
- Bir fonksiyonel bağımlılığın (functional dependency) ne demek olduğunu ve örnek veride sağlanıp sağlanmadığını kontrol etmek.
- Attribute closure ile süper anahtar ve aday anahtar bulmak.
Kötü tasarım: her şey tek tabloda
Ders boyunca kullandığımız üniversite veritabanında takes, student, course ve department ayrı tablolar. Bunları tek bir “geniş” tabloda birleştirdiğini düşün:
CREATE TABLE wide AS
SELECT t.stu_id, s.name AS stu_name, t.course_id, c.title, c.credits,
c.dept_name AS course_dept, d.building, t.grade
FROM takes t JOIN student s ON s.stu_id = t.stu_id
JOIN course c ON c.course_id = t.course_id
JOIN department d ON d.dept_name = c.dept_name;
Sonuç 14 satır (stu_name ve credits sütunlarını yer kazanmak için göstermiyorum):
| stu_id | course_id | title | course_dept | building | grade |
|---|---|---|---|---|---|
| S1 | CS101 | Intro to Programming | CS | Galata | A |
| S2 | CS101 | Intro to Programming | CS | Galata | B |
| S3 | CS101 | Intro to Programming | CS | Galata | NULL |
| S5 | CS101 | Intro to Programming | CS | Galata | F |
| S1 | CS201 | Data Structures | CS | Galata | B |
| S2 | CS201 | Data Structures | CS | Galata | C |
| S1 | CS305 | Databases | CS | Galata | A |
| S4 | CS305 | Databases | CS | Galata | B |
| S3 | EE210 | Circuits | EE | Galata | A |
| S1 | MA101 | Calculus | MATH | Rumeli | B |
| S3 | MA101 | Calculus | MATH | Rumeli | C |
| S4 | MA101 | Calculus | MATH | Rumeli | A |
| S4 | MA202 | Linear Algebra | MATH | Rumeli | A |
| S7 | MA202 | Linear Algebra | MATH | Rumeli | B |
Sorgu yazmak kolaylaştı ama tablo üç tür hataya açık:
| Anomali | Bu tabloda nasıl olur |
|---|---|
| Güncelleme (update anomaly) | CS bölümü başka binaya taşınırsa 8 satırı değiştirmen gerekir. Birini unutursan CS için iki farklı bina görünür, veri çelişkili olur. |
| Ekleme (insertion anomaly) | BI100 (Biology) dersini, onu alan bir öğrenci yokken ekleyemezsin. Aynı şekilde hiç ders almamış S6 (Firat) tabloda yok. |
| Silme (deletion anomaly) | EE210 sadece 1 satırda. S3 dersi bırakıp satır silinirse “EE210 = Circuits, 3 kredi” bilgisi de yok olur. |
Kök neden: tablo birbirinden bağımsız gerçekleri (bir dersin adı, bir bölümün binası, bir öğrencinin notu) aynı satıra sıkıştırıyor. Bu gerçekleri biçimsel olarak ifade etmenin yolu fonksiyonel bağımlılık.
Fonksiyonel bağımlılık (functional dependency)
ve , şemasının öznitelik kümeleri olsun. şu demek: değerleri aynı olan her iki satırın değerleri de aynıdır. ”, ‘yi belirler” diye okunur.
Geniş tablo için gerçek dünya kuralları:
Bu FD’lerden {stu_id, course_id} tablonun tek aday anahtarı çıkıyor (aşağıda nasıl bulunacağını göreceksin).
Örnek veride kontrol etmek
Bir FD’nin ihlali için tek bir çift yeter: sol tarafı aynı, sağ tarafı farklı iki satır. SQL ile bunu gruplayarak bulursun:
-- building -> course_dept sağlanıyor mu?
SELECT building FROM wide
GROUP BY building
HAVING COUNT(DISTINCT course_dept) > 1;
Galata
Galata hem CS hem EE ile eşleşiyor: ihlal. Aynı sorguyu course_id/title ya da course_dept/building için çalıştırınca sonuç boş, yani bu FD’ler bu örnekte sağlanıyor. credits -> course_dept için sorgu 3 ve 4 değerlerini döndürür (4 kredilik dersler hem CS hem MATH).
TUZAK · örnek veri kanıt değildir. Sorgu boş döndüyse FD bu satırlarda ihlal edilmiyor demektir, şemada geçerli demek değildir. Yarın gelecek bir satır onu bozabilir. FD bir tasarım kararıdır (gerçek dünya kuralı); veri onu sadece çürütebilir.
Aşikar bağımlılık (trivial dependency)
ise her ilişkide doğrudur: , . Bilgi taşımazlar. Sınavda “list the non-trivial FDs” denirse bunları yazma.
Armstrong aksiyomları
Verilen FD kümesi ‘den başka FD’ler türetilebilir. Türetilebilen her şeyin kümesine ‘nin kapanışı (closure of F) denir ve diye yazılır. Üç temel kural yeter (sound ve complete):
| Kural | İfade |
|---|---|
| Yansıma (reflexivity) | ise |
| Genişletme (augmentation) | ise |
| Geçişlilik (transitivity) | ve ise |
Bunlardan türetilen pratik kurallar:
| Kural | İfade |
|---|---|
| Birleşim (union) | ve ise |
| Ayrışım (decomposition) | ise ve |
| Sözde geçişlilik (pseudotransitivity) | ve ise |
Çözümlü örnek. verildiğinde ‘yi türet.
1. A -> B, B -> C geçişlilik A -> C
2. A -> C, D ekle genişletme AD -> CD
3. AD -> CD, CD -> E geçişlilik AD -> E
TUZAK · sol tarafı bölemezsin. Ayrışım kuralı sadece sağ taraf için geçerli. ‘den çıkmaz. “Decomposition” görünce sağ tarafı böldüğünü hatırla.
genelde çok büyük olduğu için elle listelenmez. Pratikte asıl araç öznitelik kümesinin closure’ı.
Öznitelik closure’ı (attribute closure)
: altında ‘in belirlediği tüm özniteliklerin kümesi. Algoritma:
sonuç := X
tekrarla:
F'deki her L -> M için:
L ⊆ sonuç ise sonuç := sonuç ∪ M
değişiklik olmayana kadar
Çözümlü örnek. , .
{A}+ : A
A -> B AB
B -> E ABE
(AC -> D için C yok, DE -> G için D yok) → {A,B,E}
{A,C}+ : AC
A -> B ABC
AC -> D ABCD
B -> E ABCDE
DE -> G ABCDEG → tüm şema
Closure üç soruyu birden cevaplar:
- türetilebilir mi? ise evet. , o yüzden türetilemez ama türetilebilir.
- süper anahtar (superkey) mı? ise evet. AC süper anahtar.
- aday anahtar (candidate key) mı? Süper anahtar ve hiçbir öz alt kümesi süper anahtar değilse evet. ve şemayı vermiyor, AC aday anahtar.
Bütün aday anahtarları bulmak
Kaba kuvvet alt küme demek. Sınavda hızlı yol şu gözlem:
- Hiçbir FD’nin sağında görünmeyen öznitelik başka hiçbir şeyden türetilemez, o yüzden her anahtarda olmak zorunda.
- Sadece sağda görünen (hiç solda olmayan) öznitelik hiçbir minimal anahtarda olmaz.
- Önce “zorunlu” kümenin closure’ını al. Yetmiyorsa ona sırayla birer öznitelik ekle, sonra ikişer. Bulduğun anahtarın üst kümelerini atla.
Çözümlü örnek. , .
Sağda hiç olmayan: B → her anahtarda B var
{B}+ = {B} → yetmez
{A,B}+: AB -> C, C -> D, D -> E = ABCDE anahtar
{B,C}+: C -> D, D -> E, E -> A, AB -> C = ABCDE anahtar
{B,D}+: D -> E, E -> A, AB -> C = ABCDE anahtar
{B,E}+: E -> A, AB -> C, C -> D = ABCDE anahtar
Dört aday anahtar: AB, BC, BD, BE. Üçlü kümeleri denemene gerek yok, hepsi bunlardan birini içerir.
Döngü içeren bir örnek: , . D hiçbir sağda yok, . A, B ya da C’den herhangi biri döngüyü tamamlar: anahtarlar AD, BD, CD.
İPUCU · süper anahtar sayısı. Aday anahtar tekse ve öznitelikliyse, öznitelikli şemada süper anahtar sayısı olur (anahtar artı kalanların herhangi bir alt kümesi). , anahtar A: süper anahtar. Birden çok anahtar varsa kesişimleri çift saymamaya dikkat et.
Geniş tabloya dönersek, harflerle yaz: S = stu_id, N = stu_name, C = course_id, T = title, K = credits, D = course_dept, B = building, G = grade. . S ve C sağda yok, her şeyi veriyor: tek aday anahtar {stu_id, course_id}. : anahtarın sadece bir parçası bu kadar özniteliği belirliyor. Gelecek hafta bunun adını koyacağız: kısmi bağımlılık (partial dependency).
Sık yapılan hatalar
| Yanlış düşünce | Doğrusu |
|---|---|
| Örnek veride ihlal yoksa FD geçerlidir | Veri sadece çürütür; FD bir tasarım kuralıdır |
| ise | Sol taraf bölünmez; sadece sağ taraf ayrışır |
| Closure’da FD’leri bir kez taramak yeter | Değişiklik bitene kadar baştan tara; yeni eklenen öznitelik eski bir FD’yi açabilir |
| Süper anahtar = aday anahtar | Aday anahtar minimal süper anahtardır |
| Tek bir aday anahtar vardır | Birden çok olabilir (AB, BC, BD, BE) |
| Sağda hiç olmayan özniteliği atlamak | O öznitelik her anahtarda bulunmak zorunda |
COUNT(DISTINCT y) NULL’ı da sayar | NULL’ları saymaz; NULL içeren sağ tarafı ayrıca kontrol et |
Kendini test et
Sınavdaki gibi İngilizce sorular. Önce kâğıt kalemle çöz, sonra cevabı aç.
In the wide table wide(stu_id, stu_name, course_id, title, credits, course_dept, building, grade), student S3 drops EE210 and we delete that row. Afterwards the database no longer knows that EE210 is called *Circuits* and has 3 credits. Which anomaly is this?
Cevabı göster
EE210 geniş tabloda yalnızca 1 satırda geçiyor (sadece S3 almış). Kayıt silinince dersin kendisine ait bilgi (title, credits) de gidiyor. İstemediğin bir bilginin silmeyle birlikte kaybolması silme anomalisi (deletion anomaly).
Is the functional dependency trivial? Explain in one sentence.
Cevabı göster
aşikardır (trivial) eğer ise. Burada , yani her ilişkide her zaman sağlanır. Bilgi taşımaz.
The department table contains (CS, Galata, 500000), (EE, Galata, 350000), (MATH, Rumeli, 200000), (BIO, Kadikoy, 150000). Does the FD building -> dept_name hold on this instance?
Cevabı göster
FD ihlali için aynı sol taraf değerine sahip, sağ tarafı farklı iki satır yeter. Galata hem CS hem EE ile eşleşiyor. Tersine dept_name -> building bu örnekte sağlanıyor ama bir örnekten FD'nin şemada geçerli olduğu kanıtlanamaz, sadece çürütülebilir.
Write an SQL query that returns every course_id that violates the FD course_id -> title in table wide. (An empty result means the FD holds on this instance.)
Cevabı göster
Sol tarafa göre grupla, her grupta sağ tarafın kaç farklı değeri olduğunu say. 1'den fazlaysa ihlal var. Örnek veride sonuç boş döner. Dikkat: COUNT(DISTINCT ...) NULL'ları saymaz, sağ tarafta NULL olabilecekse ayrıca kontrol et.
Let with . Compute .
Cevabı göster
Başla: {A}. : {A,B}. : {A,B,E}. için C lazım, yok. için D lazım, yok. Değişiklik bitti: .
Same and as above. Is a superkey of ? Is it a candidate key?
Cevabı göster
: ile {A,B,C}, ile {A,B,C,D}, ile {A,B,C,D,E}, ile hepsi. Süper anahtar. A ve C hiçbir FD'nin sağında yok, yani her anahtarda olmak zorundalar. ve tüm şemayı vermiyor, o yüzden AC minimal ve tek aday anahtar.
Let with . Is a superkey?
Cevabı göster
{B,D} ile başla. yeni bir şey eklemiyor. için A, için C, için E lazım. Hiçbiri yok. Closure {B,D}'de kalıyor, şemanın tamamı değil.
Same and as the previous question. Find all candidate keys.
Cevabı göster
B hiçbir sağ tarafta yok, yani her anahtarda var. {B}+ = {B,D}, yetmez. B'ye tek öznitelik ekle:
AB: , , ile hepsi. Anahtar.
BC: , , ile hepsi. Anahtar.
BE: , , ile hepsi. Anahtar.
BD: {B,D}, değil. AB, BC, BE'nin üst kümeleri minimal olmaz; BD'yi içeren 3'lüleri dene: ABD, BCD, BDE zaten bir anahtar içeriyor. Sonuç: AB, BC, BE.
Let with . Does imply ?
Cevabı göster
türetilebilir mi sorusunun cevabı: mı? , D içinde yok. Yani F'den çıkmaz. (Ama çıkar, çünkü her şeyi içerir.)
Given , derive using Armstrong's axioms. Name each rule.
Cevabı göster
1) ve , geçişlilik (transitivity): .
2) Her iki tarafa D ekle, genişletme (augmentation): .
3) ve , geçişlilik: .
Kontrol: , E içinde var.
Let with . List all candidate keys and give the number of superkeys.
Cevabı göster
C ve D hiçbir sağ tarafta yok: her anahtarda varlar. {C,D}+ = {C,D}. A ekle: {A,C,D}+ = hepsi. B ekle: {B,C,D}+ = hepsi. İkisi de minimal. Süper anahtarlar CD'yi ve A ya da B'den en az birini içeren kümeler: ACD, BCD, ABCD. Toplam 3.
The instructor table has (I1, Aksoy, CS, 95000) and (I2, Demir, CS, 80000). A student claims dept_name -> salary because 'every department has a fixed salary scale'. Does the instance support this FD?
Cevabı göster
Aynı dept_name (CS) için iki farklı salary var, FD bu örnekte ihlal ediliyor. Bir FD'yi geçerli kılan gerçek dünya kuralıdır; örnek veri onu ancak çürütebilir. Burada çürütülmüş. MATH de iki farklı maaşla ihlal ediyor.
Doğrulama: Geniş tablo ve FD ihlal kontrolleri node:sqlite ile örnek veritabanında çalıştırıldı; tüm closure, anahtar ve türetme cevapları verify/SEN2104/lib.mjs fonksiyonlarıyla hesaplandı (verify/SEN2104/09.mjs, 39 kontrol, 0 hata).