Ayrıştırma: kayıpsız birleştirme, bağımlılık koruma, BCNF ve 3NF algoritmaları
Bir şemayı parçalara bölerken veri kaybetmemeyi (lossless join) ve FD'leri korumayı test etmeyi, BCNF ayrıştırma ve 3NF sentez algoritmalarını adım adım uygulamayı öğrenirsin.
Geçen hafta bir şemanın hangi normal formda olduğunu bulmayı öğrendin. Normal form düşükse çözüm şemayı parçalara ayırmak (decomposition). Ama her bölme iyi değil. Bir ayrıştırmadan iki şey istersin:
- Kayıpsız birleştirme (lossless join): Parçaları NATURAL JOIN ile geri birleştirince tam olarak orijinal tablo çıkmalı.
- Bağımlılık koruma (dependency preservation): Her FD, join yapmadan tek tek parçalarda denetlenebilmeli.
Sınavda tipik sorular: “Is this decomposition lossless?”, “Is it dependency preserving?”, “Decompose R into BCNF”, “Apply the 3NF synthesis algorithm”.
Kayıplı ayrıştırma: veride görelim
Örnek veritabanından öğrencinin bölümünü ve aldığı dersi tutan bir tablo türet (bölümü NULL olan S7 dışarıda): enr(stu_id, dept_name, course_id), 13 satır. Tek FD: .
Şimdi bunu yanlış yerden bölelim:
CREATE TABLE r1 AS SELECT DISTINCT stu_id, dept_name FROM enr; -- 5 satır
CREATE TABLE r2 AS SELECT DISTINCT dept_name, course_id FROM enr; -- 10 satır
SELECT COUNT(*) FROM r1 NATURAL JOIN r2;
18
13 satırlık tablo 18 satır olarak geri geldi. Fazlalığı EXCEPT ile görebilirsin:
SELECT stu_id, dept_name, course_id FROM r1 NATURAL JOIN r2
EXCEPT SELECT * FROM enr;
| stu_id | dept_name | course_id |
|---|---|---|
| S2 | CS | CS305 |
| S2 | CS | MA101 |
| S5 | CS | CS201 |
| S5 | CS | CS305 |
| S5 | CS | MA101 |
Bu satırlara sahte satır (spurious tuple) denir. Neden sadece CS? Join dept_name üzerinden yapılıyor ve CS’de üç öğrenci var (S1, S2, S5). r2, “bir CS öğrencisi bu dersi aldı” bilgisini tutuyor ama hangi öğrenci olduğunu kaybetmiş. EE’de ve MATH’te tek öğrenci olduğu için orada karışıklık çıkmıyor.
TUZAK · “kayıplı” satır kaybetmek demek değil. Kayıplı ayrıştırmada join daha fazla satır üretir. Kaybedilen şey bilgi: hangi satırın gerçek olduğunu artık bilemezsin.
Doğru bölme: r1(stu_id, dept_name) ve r3(stu_id, course_id). Kesişim stu_id, ve olduğu için stu_id r1’in anahtarı. r1 NATURAL JOIN r3 tam 13 satır verir, EXCEPT sonucu boş.
İkili test (binary decomposition)
‘yi ve ‘ye bölüyorsan, ayrıştırma ancak ve ancak şu FD’lerden biri ‘da ise kayıpsızdır:
Yani kesişim, parçalardan birinin süper anahtarı olmalı. Hesap: kesişimin closure’ını al.
, :
| Ayrıştırma | Kesişim | Closure | Sonuç |
|---|---|---|---|
| (A,B), (A,C,D) | A | kayıpsız | |
| (A,B,C), (C,D) | C | kayıpsız | |
| (A,B), (C,D) | boş | boş | kayıplı |
| (A,B,D), (B,C) | B | kayıplı |
Üç ve daha fazla parça: chase testi
İkili test sadece iki parça için. Daha fazlası için tablo (tableau) yöntemi:
- Sütunlar R’nin öznitelikleri, her parça bir satır.
- Satırda parçanın içerdiği sütunlara a, diğerlerine b (satıra özel) yaz.
- Her için: X sütunlarında aynı olan iki satırın Y değerlerini eşitle (biri a ise ikisi de a olur).
- Değişiklik bitene kadar tekrarla. Tamamen a’dan oluşan bir satır çıkarsa kayıpsız.
Çözümlü örnek. , , parçalar (A,B), (C,D), (A,C,E).
A B C D E
R1(AB) a a b b b
R2(CD) b b a a b
R3(ACE) a b a b a
A -> B : R1 ve R3 A'da eşit → R3.B = a
C -> D : R2 ve R3 C'de eşit → R3.D = a
R3 : a a a a a → KAYIPSIZ
Aynı F ile (A,B), (C,D), (B,D,E) denersen hiçbir FD uygulanamaz (A’da ya da C’de eşit iki satır yok, BD’de eşit iki satır yok) ve tamamen a satırı oluşmaz: kayıplı. Bir sezgi (kural değil): ilk örnekte kazanan satır, aday anahtar AC’yi içeren R3 oldu. İkinci örnekte A ile C’yi birlikte tutan parça yok.
Bağımlılık koruma (dependency preservation)
, ‘nın ‘ye izdüşümü (projection) olsun: ‘daki, tüm öznitelikleri içinde olan FD’ler. Ayrıştırma koruyucudur eğer . Pratik test: F’deki her için ‘in closure’ını sadece izdüşüm FD’leriyle al; Y çıkıyorsa korunuyor.
Örnek 1. , , parçalar (A,B), (A,C), (C,D).
İzdüşümler: , , . Bu kümeyle : kaybolur. Ayrıştırma kayıpsız ama koruyucu değil. Parçaları (A,B), (B,C), (C,D) seçseydin üç FD de bir parçada olurdu.
Örnek 2. , , parçalar (A,B), (B,C). ‘yı içeren parça yok. Ama olduğu için AB’ye izdüşümde , BC’ye izdüşümde var. : korunuyor.
TUZAK · izdüşüm sadece F’den alınmaz. Bir parçaya düşen FD’leri bulurken F’deki listeye bakıp “bu FD’nin öznitelikleri parçada mı?” demek yetmez. ‘dan gelen FD’leri de düşünmen gerekir; bunun yolu parçadaki her alt kümenin closure’ını almak.
BCNF ayrıştırma algoritması
sonuç := {R}
sonuçta BCNF olmayan bir Ri oldukça:
Ri'de geçerli, X süper anahtar olmayan bir X -> Y bul
Ri yerine (X+ ∩ Ri) ve Ri − (X+ − X) koy
Her bölmede kesişim X ve X ilk parçanın anahtarı, o yüzden sonuç her zaman kayıpsız. Koruma ise garanti değil.
Çözümlü örnek. , . A ve C sağda yok, = ABCDE: tek anahtar AC. Her adımda en kısa ihlal eden sol tarafı seçiyoruz.
ABCDE : A -> B ihlal. A+ ∩ Ri = AB → AB ve ACDE
AB : BCNF
ACDE : D -> E ihlal. D+ ∩ Ri = DE → DE ve ACD
DE : BCNF
ACD : izdüşüm AC -> D, AC anahtar → BCNF
Sonuç : AB, DE, ACD
Koruma kontrolü: . B ve C aynı parçada değil, izdüşümlerle . Kayboldu. İlk adımda ile başlasaydın farklı bir sonuç bulabilirdin; ayrıştırma tek değildir, sınavda seçtiğin sırayı yaz.
Üniversite örneği: wide(S, N, C, T, G) = (stu_id, stu_name, course_id, title, grade), . Algoritma CT, NS ve CGS’yi verir: course(course_id, title), student(stu_id, stu_name), takes(stu_id, course_id, grade). Bu sefer üç FD de korunuyor; ders boyunca kullandığımız tabloların neden böyle ayrıldığının cevabı bu.
3NF sentez algoritması (synthesis)
1. F'nin kanonik örtüsünü Fc bul
2. Fc'deki her X -> Y için şema (X ∪ Y) oluştur
3. Hiçbir şema R'nin bir aday anahtarını içermiyorsa, bir aday anahtarı ayrı şema olarak ekle
4. Başka bir şemanın alt kümesi olan şemaları sil
Sonuç hem kayıpsız hem bağımlılık koruyan bir 3NF ayrıştırmasıdır.
Aynı örnek: (gereksiz bir şey yok). Şemalar AB, BCD, DE. Hiçbiri AC’yi içermiyor, AC ekle. Sonuç AB, BCD, DE, AC. Chase testi kayıpsız diyor, üç FD de birer parçanın içinde. Bu örnekte parçaların hepsi BCNF bile çıktı; her zaman böyle olmaz.
BCNF mi 3NF mi?
| BCNF ayrıştırma | 3NF sentez | |
|---|---|---|
| Kayıpsız | her zaman | her zaman |
| Bağımlılık koruma | garanti değil | her zaman |
| Tekrar (redundancy) | FD kaynaklı tekrar yok | biraz kalabilir |
Klasik ikilem: tutoring(stu_id, subject, tutor_id), , . BCNF ayrıştırma (tutor_id, subject) ve (stu_id, tutor_id) verir. Kayıpsız ama “bir öğrenci bir konuda tek öğretici” kuralı artık tek tabloda denetlenemiyor. Tasarımcı çoğu zaman 3NF’de kalıp bu kuralı korumayı seçer.
Sık yapılan hatalar
| Yanlış düşünce | Doğrusu |
|---|---|
| Kayıplı join satır kaybeder | Fazla (sahte) satır üretir, bilgi kaybolur |
| Kesişim boş değilse kayıpsız | Kesişim bir parçanın süper anahtarı olmalı |
| 3+ parçaya ikili testi uygulamak | Chase tablosunu kullan |
| FD’yi içeren parça yoksa korunmaz | İzdüşüm ‘dan alınır; zincirle türetilebilir |
| BCNF ayrıştırma bağımlılıkları korur | Kayıpsızdır ama korumayabilir |
| 3NF sentezde anahtar adımını atlamak | Hiçbir parça anahtar içermiyorsa kayıplı olabilir |
| BCNF ayrıştırmanın tek cevabı vardır | İhlal seçim sırası farklı sonuç verebilir |
Kendini test et
Sınavdaki gibi İngilizce sorular. Önce kâğıt kalemle çöz, sonra cevabı aç.
Let with . Is the decomposition , lossless?
Cevabı göster
İkili test: . , yani . Kesişim parçalardan birinin süper anahtarı: kayıpsız.
Same and . Is the decomposition , lossless?
Cevabı göster
Kesişim boş küme. Boş küme hiçbir şeyi belirlemez, birleştirme Kartezyen çarpıma döner ve orijinalde olmayan satırlar üretir. Kayıplı.
Same and . Is , lossless?
Cevabı göster
Kesişim {B}. : B ne 'i ne 'yi belirliyor. İkili test başarısız, kayıplı.
Table enr(stu_id, dept_name, course_id) is split into r1(stu_id, dept_name) and r2(dept_name, course_id). S5 is a CS student who took only CS101. The CS students in enr took CS101, CS201, CS305 and MA101. After r1 NATURAL JOIN r2, which spurious courses appear for S5?
Cevabı göster
Birleştirme dept_name üzerinden yapılıyor. S5 → CS, CS → {CS101, CS201, CS305, MA101}. Yani join S5 için dört ders üretir; S5 sadece CS101 almış, diğer üçü sahte satır (spurious tuple). Kesişim dept_name hiçbir parçanın anahtarı değil, o yüzden kayıplı. Bütün tabloda 13 gerçek satır 18'e çıkıyor, 5 sahte.
Let with . Use the chase (tableau) test to decide whether , , is lossless.
Cevabı göster
Tablo: her parça bir satır, parçadaki sütunlara a, diğerlerine b yaz.
R1: a a b b b, R2: b b a a b, R3: a b a b a.: R1 ve R3 A'da eşit, R3'ün B'si a olur. : R2 ve R3 C'de eşit, R3'ün D'si a olur. R3 = a a a a a. Tamamen a olan satır çıktı: kayıpsız.
Same and . Is , , lossless?
Cevabı göster
Tablo: R1: a a b b b, R2: b b a a b, R3: b a b a a.: A'da eşit iki satır yok. : C'de eşit iki satır yok. : R1 ve R3 B'de eşit ama D'de farklı. Hiçbir FD uygulanamıyor ve hiçbir satır tamamen a değil. Kayıplı. (Ayrıca A ve C'yi birlikte içeren parça yok; anahtar AC hiçbir parçada değil.)
Let with and the decomposition , , . Is it dependency preserving? If not, which FD is lost?
Cevabı göster
İzdüşümler: AB'de ; AC'de ; CD'de . Bu kümeyle , C yok. hiçbir parçada kontrol edilemiyor ve türetilemiyor: korunmuyor. (Ayrıştırma yine de kayıpsız.)
Let with , decomposed into and . No piece contains both and . Is preserved?
Cevabı göster
İzdüşüm sadece F'deki FD'ler değil, 'dan gelenler. AB'ye izdüşüm: ve (çünkü ). BC'ye izdüşüm: , . Bu kümeyle : , , A içinde. korunuyor. Ders: "FD'yi içeren parça yok" demek "korunmuyor" demek değil.
Let with . Decompose into BCNF (at each step use the shortest violating left side). Is the result dependency preserving?
Cevabı göster
Anahtar AC. 1) ihlal, : R → AB ve ACDE.
2) ACDE içinde ihlal (): DE ve ACD.
3) ACD: tek FD , AC anahtar, BCNF.
Sonuç AB, DE, ACD. : B ve C aynı parçada değil, izdüşümlerle . Korunmuyor.
Same and . Apply the 3NF synthesis algorithm.
Cevabı göster
Kanonik örtü zaten . Her FD için bir şema: AB, BCD, DE. Hiçbiri aday anahtar AC'yi içermiyor, AC'yi ekle. Biri diğerinin alt kümesi değil, silme yok. Sonuç kayıpsız ve bağımlılıkları koruyor (bu örnekte parçaların hepsi BCNF bile).
tutoring(stu_id, subject, tutor_id) has FDs tutor_id -> subject and stu_id, subject -> tutor_id. Give its BCNF decomposition and the FD that is no longer enforceable in a single table.
Cevabı göster
BCNF'yi bozuyor. = {tutor_id, subject}: bir parça (tutor_id, subject), diğeri (stu_id, tutor_id). Kesişim tutor_id ilk parçanın anahtarı: kayıpsız. Ama stu_id ve subject artık aynı tabloda değil; "bir öğrenci bir konu için tek öğretici" kuralı bir join olmadan denetlenemez. Bu yüzden şema 3NF'de bırakılabilir.
Let with . Decompose into BCNF (shortest violating left side first) and name a lost dependency.
Cevabı göster
Anahtarlar AB, BC, BD (3NF ama BCNF değil). 1) türetilmiş FD ihlal (, C tek harfle alfabetik ilk): ACD ve BC.
2) ACD içinde ihlal (D süper anahtar değil): AD ve CD.
3) AD, CD, BC iki öznitelikli, BCNF.: A ve B aynı parçada değil, izdüşümlerle . Korunmuyor. Kayıpsızlık chase ile doğrulanır.
Doğrulama: Kayıplı/kayıpsız birleştirme örneği node:sqlite ile örnek veritabanında NATURAL JOIN ve EXCEPT çalıştırılarak sayıldı; ikili test, chase testi, bağımlılık koruma (FD izdüşümü ile), BCNF ayrıştırma izi ve 3NF sentezi verify/SEN2104/lib.mjs ile hesaplandı (verify/SEN2104/11.mjs, 52 kontrol, 0 hata). BCNF ayrıştırmada her adımda en kısa (eşitse alfabetik ilk) ihlal eden sol taraf seçildi.