Normalleşmeye Yardımcı Olmak İçin Geçiş Bağımlılıkları Önlemek
Bir veritabanındaki geçiş bağımlılığı, aynı tablodaki fonksiyonel bağımlılığa neden olan değerler arasında dolaylı bir ilişkidir. Üçüncü Normal Form'un (3NF) normalizasyon standardını elde etmek için, herhangi bir geçiş bağımlılığını ortadan kaldırmalısınız.
Doğası gereği, geçişli bir bağımlılık, aralarında işlevsel bir bağımlılığa sahip olan üç veya daha fazla öznitelik (veya veritabanı sütunu) gerektirir; bu, bir tablodaki Sütun A'nın bir ara Sütun C boyunca Sütun B'ye dayanması anlamına gelir.
Bunun nasıl işe yaradığını görelim.
Geçiş Bağımlılığı Örneği
YAZARLAR
AUTHOR_ID | Yazar | Kitap | Author_Nationality |
---|---|---|---|
Auth_001 | Orson Scott Card | Ender'in Oyunu | Amerika Birleşik Devletleri |
Auth_001 | Orson Scott Card | Ender'in Oyunu | Amerika Birleşik Devletleri |
Auth_002 | Margaret Atwood | Elçinin Masalı | Kanada |
Yukarıdaki YAZARLAR örneğinde:
- Kitap → Yazar : Burada Kitap özniteliği Author özniteliğini belirler. Kitap adını biliyorsanız, yazarın adını öğrenebilirsiniz. Bununla birlikte, Yazar bir kitap yazamaz, çünkü bir yazar birden fazla kitap yazabilir. Örneğin, yazarın adı Orson Scott Card'ı bildiğimiz için, kitap adını hala bilmiyoruz.
- Yazar → Author_Nationality : Aynı şekilde Author özniteliği, Author_Nationality'yi belirler, ancak başka bir şekilde değil; Çünkü milliyetin bilinmesi, yazarı belirleyebileceğimiz anlamına gelmez.
Ancak bu tablo geçiş bağımlılığını ortaya koymaktadır:
- Kitap → Author_Nationality: Kitabın ismini biliyorsak, yazarlığı aracılığı ile uyruğu belirleyebiliriz.
Geçişli Bağımlılıkları Önleme
Üçüncü Normal Formu sağlamak için, geçiş bağımlılığını kaldıralım.
Kitap sütununu Yazarlar tablosundan kaldırıp ayrı bir Kitap tablosu oluşturarak başlayabiliriz:
KİTAPLAR
Book_ID | Kitap | AUTHOR_ID |
---|---|---|
Book_001 | Ender'in Oyunu | Auth_001 |
Book_001 | Zihin Çocukları | Auth_001 |
Book_002 | Elçinin Masalı | Auth_002 |
YAZARLAR
AUTHOR_ID | Yazar | Author_Nationality |
---|---|---|
Auth_001 | Orson Scott Card | Amerika Birleşik Devletleri |
Auth_002 | Margaret Atwood | Kanada |
Bu düzeltdi mi? Şimdi bağımlılıklarımızı inceleyelim:
KİTAPLAR tablosu :
- Book_ID → Kitap: Kitap , Book_ID'ye bağlıdır.
- Bu tabloda başka hiçbir bağımlılık yok, bu yüzden iyiyiz. Yabancı anahtarın Author_ID, bu tabloyu birincil anahtarını Author_ID aracılığıyla AUTHORS tablosuna bağladığını unutmayın . İlişkisel veritabanlarının anahtar tasarımı olan geçiş bağımlılığından kaçınmak için bir ilişki kurduk.
YAZARLAR tablosu :
- Author_ID → Yazar: Yazar Author_ID'ye bağlıdır.
- Yazar → Author_Nationality: Milliyet yazar tarafından belirlenebilir.
- Author_ID → Author_Nationality: Milliyet Author_ID'den Author özniteliği üzerinden belirlenebilir. Hala bir geçiş bağımlılığımız var.
Bu verileri normalleştirmek için üçüncü bir tablo eklememiz gerekiyor:
ÜLKELER
country_id | ülke |
---|---|
Coun_001 | Amerika Birleşik Devletleri |
Coun_002 | Kanada |
YAZARLAR
AUTHOR_ID | Yazar | country_id |
---|---|---|
Auth_001 | Orson Scott Card | Coun_001 |
Auth_002 | Margaret Atwood | Coun_002 |
Şimdi masalar arasında bağlantı kurmak için yabancı anahtarlardan yararlanan üç tablo var:
- BOOK tablosunun yabancı anahtarı Author_ID, bir kitabı bir yazarın AUTHORS tablosuna bağlar.
- YAZARLAR tablosunun yabancı anahtarı Country_ID bir yazarın ÜLKELER tablosundaki bir ülkeye bağlanır.
- COUNTRIES tablosunun yabancı bir anahtarı yoktur, çünkü bu tasarımdaki başka bir tabloya bağlanma ihtiyacı yoktur.
Geçiş Bağımlılıkları Neden Kötü Veritabanı Tasarımıdır?
3NF'nin sağlanmasına yardımcı olmak için geçiş bağımlılıklarından kaçınmanın değeri nedir? İlk masamızı tekrar ele alalım ve yarattığı sorunları görelim:
YAZARLAR
AUTHOR_ID | Yazar | Kitap | Author_Nationality |
---|---|---|---|
Auth_001 | Orson Scott Card | Ender'in Oyunu | Amerika Birleşik Devletleri |
Auth_001 | Orson Scott Card | Zihin Çocukları | Amerika Birleşik Devletleri |
Auth_002 | Margaret Atwood | Elçinin Masalı | Kanada |
Bu tarz bir tasarım, veri anormalliklerine ve tutarsızlıklarına katkıda bulunabilir, örneğin:
- Eğer "Zihin Çocukları" ve "Ender'in Oyunu" adlı iki kitabı sildiyseniz, "Orson Scott Card" yazarı ve uyruğunu tamamen veritabanından silecektiniz.
- Ayrıca bir kitap eklemediğiniz sürece veritabanına yeni bir yazar ekleyemezsiniz; yazar henüz yayınlanmamışsa ya da yazdığı bir kitabın adını bilmiyorsanız ne olur?
- "Orson Scott Card" vatandaşlığını değiştirirse, göründüğü tüm kayıtlarda değiştirmelisiniz. Aynı yazarla birden çok kayda sahip olmak yanlış verilere yol açabilir: veri girişi yapan kişi onun için birden fazla kayıt olduğunu fark edemez ve verileri yalnızca bir kayıtta değiştirirse ne olur?
- Yazarı tamamen silmeden "Handmaid's Tale" gibi bir kitabı silemezsiniz.
Bunlar, normalleşmenin , geçiş bağımlılıklarının önlenmesinin, verilerin korunmasının ve tutarlılığın sağlanmasının sadece bir kaç nedenidir.