İçeriğe geç
Educora
Üniversite30 dk18 / 22

Veritabanı tasarımı ve normalizasyon

Bir ER modeli kur, ilişkilerin kardinalitesini belirle, fonksiyonel bağımlılıkları bul ve tabloları adım adım 1NF, 2NF, 3NF ve BCNF'ye kadar ayrıştır.

Kendini test et
Bu derste öğreneceklerin
  • Varlıkları, nitelikleri ve ilişkileri bir ER modelinde tanımlamak ve 1:1, 1:N ve M:N ilişkilerini tablolara dönüştürmek
  • Fonksiyonel bağımlılıkları ve aday anahtarları bulmak; güncelleme, ekleme ve silme anomalilerini açıklamak
  • Bir tabloyu kayıpsız biçimde 2NF, 3NF ve BCNF'ye ayrıştırmak ve bağımlılıkların korunup korunmadığını değerlendirmek

Ders kayıtlarının tek bir büyük Excel tablosunda tutulduğunu düşün: her satırda öğrencinin adı, şehri, dersin adı, öğretmen ve puan var. Öğretmen soyadını değiştirdiğinde bunu yüzlerce satırda düzeltmek gerekir; birini atlarsan veritabanı kendisiyle çelişir. Yeni bir ders, biri kaydolana kadar eklenemez; son öğrenci dersten ayrıldığında ise dersin kendisi de kaybolur. Bu derste veritabanını her olgu yalnızca bir yerde saklanacak şekilde tasarlamayı öğreneceğiz. Bunun bilimsel adı normalizasyondur ve alıştırma veritabanımız tam da bu kurallarla kurulmuştur.

ER modeli: varlıklar, ilişkiler, kardinalite

Tasarım tablolarla değil, kavramsal bir modelle başlar. Varlık (entity), hakkında veri tuttuğumuz şeydir: öğrenci, ders, ürün. Nitelik (attribute) onun bir özelliğidir: ad, fiyat. İlişki (relationship) varlıkları bağlar: öğrenci bir derse kaydolur, müşteri bir ürünü sipariş eder. Bu modeli 1976'da Peter Chen varlık–ilişki (ER) diyagramları biçiminde önerdi.

Tanım
Kardinalite

Bir varlığın kaç örneğinin diğer varlığın tek bir örneğiyle ilişkili olabileceğini gösterir: bire bir (1:1), bire çok (1:N) ya da çoka çok (M:N). Kardinalite, yabancı anahtarın hangi tabloya yerleşeceğini belirler.

İlişkiÖrnekTablolarda nasıl kurulur
1:1öğrenci — öğrenci kimlik kartıikinci tabloda UNIQUE bir yabancı anahtar ya da ortak birincil anahtar
1:Nmüşteri — siparişler“çok” tarafında bir yabancı anahtar: orders.customer_id
M:Nöğrenciler — dersleriki yabancı anahtarlı bir ara tablo: enrollments
İlişkisel bir veritabanı M:N ilişkisini doğrudan saklayamaz; bu ilişki her zaman iki 1:N ilişkisine bölünür.

Fonksiyonel bağımlılıklar ve anahtarlar

Normalizasyonun temel kavramı fonksiyonel bağımlılıktır (FB). X → Y, “X'in değeri Y'nin değerini tek biçimde belirler” demektir: course_id → teacher, yani dersi bilirsek öğretmeni de biliriz. FB, verinin rastlantısal bir özelliği değil, bir iş kuralıdır: onu alan uzmanlarından öğreniriz; tablodaki mevcut satırlar ise onu yalnızca çürütebilir.

X → Y ⇔ ∀ t₁, t₂ ∈ r : t₁[X] = t₂[X] ⇒ t₁[Y] = t₂[Y]
burada:
  • Xbelirleyen (determinant) — nitelikler kümesi
  • Ybağımlı nitelikler kümesi
  • rtablonun (bağıntının) herhangi bir geçerli durumu
  • t₁, t₂tablonun herhangi iki satırı; t[X] — satırın X sütunlarındaki değerleri

X'te aynı olan iki satır Y'de de aynı olmak zorundadır.

Diğer tüm nitelikleri belirleyen bir nitelikler kümesi süper anahtardır; hiçbir niteliği çıkarılamayan süper anahtar ise aday anahtardır. Aday anahtarlardan biri birincil anahtar olarak seçilir. Herhangi bir aday anahtarın parçası olan niteliğe asal (prime) nitelik denir; bu ayrım 3NF ile BCNF'yi ayırt etmek için gerekecek.

Anomaliler: tekrar neden tehlikelidir

  • Güncelleme anomalisi — aynı olgu birkaç satırda bulunur; bir kopya değiştiğinde diğerleri eski kalır.
  • Ekleme anomalisi — bir olgu başka bir olgu olmadan kaydedilemez (henüz kaydı olmayan bir dersi eklemek).
  • Silme anomalisi — bir olguyu silmek başka bir olguyu da yok eder (son kayıtla birlikte dersin öğretmeni de kaybolur).
SQL
-- a denormalised copy: the teacher is repeated in every row
CREATE TABLE report_flat AS
SELECT e.student_id, s.first_name, e.course_id, c.title, c.teacher, e.score
FROM enrollments AS e
JOIN students AS s ON s.id = e.student_id
JOIN courses  AS c ON c.id = e.course_id;

-- the name is corrected in one row only
UPDATE report_flat SET teacher = 'R. Safarov'
WHERE course_id = 1 AND student_id = 1;

SELECT course_id, teacher, COUNT(*) AS rows_with_it
FROM report_flat
WHERE course_id = 1
GROUP BY course_id, teacher
ORDER BY teacher;
▸ Beklenen çıktı
course_id | teacher | rows_with_it
1 | R. Safarov | 1
1 | Ramin Səfərov | 3
Bir güncelleme anomalisi: artık bir dersin iki “öğretmeni” var. Normalleştirilmiş veritabanında ad yalnızca bir kez, courses tablosunda değiştirilir.

Normal formlar: 1NF'den BCNF'ye

FormKuralTipik ihlal
1NFher hücrede tek (atomik) bir değer, tekrarlanan grup yok, satırlar bir anahtarla ayrılırphones = '050…, 055…'
2NF1NF + asal olmayan her nitelik aday anahtarın bir parçasına değil, tamamına bağlıdıranahtar (student_id, course_id), ama student_id → city
3NF2NF + asal olmayan hiçbir nitelik başka bir asal olmayan niteliğe bağlı değildir (geçişli bağımlılık yok)course_id → teacher → teacher_phone
BCNFher önemsiz olmayan X → Y için X bir süper anahtardırteacher → subject, oysa teacher bir anahtar değil
Örnek 1: 2NF'ye ayrıştırma

Anahtarı (student_id, course_id) olan report(student_id, first_name, city, course_id, title, teacher, score) tablosu veriliyor. FB'ler: student_id → first_name, city; course_id → title, teacher; (student_id, course_id) → score. Tablo hangi normal formdadır ve nasıl ayrıştırılmalıdır?

Çözümü göster
1) Tüm değerler atomiktir ve bir anahtar vardır; 1NF sağlanır.
2) first_name ve city anahtarın yalnızca bir parçasına (student_id) bağlıdır; bu kısmi bağımlılıktır, 2NF ihlal edilir. title ve teacher için de aynısı geçerlidir.
3) Her belirleyen için ayrı bir tablo: students(student_id, first_name, city), courses(course_id, title, teacher), enrollments(student_id, course_id, score).
4) Denetim: her tabloda tek belirleyen o tablonun anahtarıdır; sonuç BCNF'dedir ve tam olarak alıştırma veritabanımızın yapısıdır.

Ayrıştırma kayıpsız olmalıdır: parçalar JOIN ile birleştirildiğinde fazla ya da eksik satır olmadan özgün tablo geri gelmelidir. İki parçaya bölmede bunu Heath teoremiyle denetleriz: ortak sütunlar parçalardan birinin anahtarı olmalıdır.

(R₁ ∩ R₂) → R₁ ∨ (R₁ ∩ R₂) → R₂
burada:
  • R₁, R₂ayrıştırmadan elde edilen iki tablonun nitelik kümeleri (R₁ ∪ R₂ = R)
  • R₁ ∩ R₂ortak nitelikler — JOIN işleminin yapıldığı sütunlar

Koşul sağlanıyorsa ayrıştırma kayıpsızdır: R = R₁ ⋈ R₂.

Örnek 2: 3NF ile BCNF arasındaki fark

lessons(student, subject, teacher): her öğretmen yalnızca bir ders verir (teacher → subject), öğrencinin her derste bir öğretmeni vardır ((student, subject) → teacher). Tablo 3NF'de mi? BCNF'de mi? BCNF'ye nasıl getirilir ve ne kaybedilir?

Çözümü göster
1) Aday anahtarlar: (student, subject) ve (student, teacher). Üç niteliğin hepsi asaldır.
2) teacher → subject: teacher bir süper anahtar değildir, ama subject asal bir niteliktir; 3NF buna izin verir, BCNF vermez.
3) BCNF ayrıştırması: teachers(teacher, subject) ve assignments(student, teacher). Ortak nitelik teacher ilk tablonun anahtarıdır; Heath teoremine göre kayıpsızdır.
4) Bedeli: (student, subject) → teacher bağımlılığı artık tek bir tablo içinde denetlenemez; bir öğrenciye aynı dersten iki öğretmen atanmasını bir tetikleyici ya da uygulama kodu engellemelidir.

Denormalizasyon ne zaman doğrudur

Normalizasyon günlük işlemler (OLTP) için idealdir: çok sayıda küçük yazma, doğruluk, çelişkisizlik. Analitik veri ambarları (OLAP) ise çoğunlukla okunur; bu yüzden bilerek denormalize edilir: “yıldız şemasında” merkezde bir olgu tablosu (satışlar), çevresinde geniş boyut tabloları (ürün, müşteri, tarih) bulunur ve raporlar az sayıda JOIN ile çalışır. Altın kural: önce 3NF'de tasarla, denormalizasyonu yalnızca ölçülmüş bir performans sorunu varsa ve her zaman bir eşitleme mekanizmasıyla (tetikleyici, görünüm, gece yenilemesi) birlikte uygula.

Alıştırma

Normalleştirilmiş tablolardan Mechanics dersi için “düz” raporu yeniden oluştur: öğrencinin adı, şehri, dersin adı, öğretmen ve puan. Sonucu puana göre azalan sırada sırala. (Kayıpsız bir ayrıştırmada JOIN, özgün tabloyu tam olarak geri verir.)

Alıştırma · SQL
SELECT s.first_name, s.city, c.title, c.teacher, e.score
FROM enrollments AS e
-- join students and courses
WHERE c.title = 'Mechanics'
ORDER BY e.score DESC;
▸ Beklenen çıktı
first_name | city | title | teacher | score
Fidan | Naxçıvan | Mechanics | Ülviyyə Axundova | 94
Murad | Gəncə | Mechanics | Ülviyyə Axundova | 81
Rəşad | Bakı | Mechanics | Ülviyyə Axundova | 77
Elvin | Sumqayıt | Mechanics | Ülviyyə Axundova | 68
Alıştırma

teacher → subject bağımlılığının mevcut veride sağlandığını denetle: her öğretmen için farklı branş sayısını (subjects) göster ve öğretmene göre sırala. Tüm değerler 1 ise veri bağımlılığı çürütmüyor demektir.

Alıştırma · SQL
SELECT teacher
       -- number of different subjects
FROM courses
GROUP BY teacher
ORDER BY teacher;
▸ Beklenen çıktı
teacher | subjects
Elnur Qasımov | 1
Nərmin Vəliyeva | 1
Ramin Səfərov | 1
Samir Hacıyev | 1
Sara Mitchell | 1
Ülviyyə Axundova | 1

Önemli noktalar

  • Tasarım bir ER modeliyle başlar; M:N ilişkisi iki yabancı anahtarlı bir ara tabloyla kurulur.
  • X → Y fonksiyonel bağımlılığı bir iş kuralıdır: X'te eşit olan satırlar Y'de de eşit olmalıdır.
  • Tekrar; güncelleme, ekleme ve silme anomalilerine yol açar; normalizasyon her olguyu tek bir yerde saklar.
  • 2NF kısmi, 3NF geçişli bağımlılıkları giderir; BCNF'de her belirleyen bir süper anahtardır.
  • Ayrıştırma kayıpsız olmalıdır (Heath teoremi); 3NF bağımlılıkları her zaman koruyabilir, BCNF her zaman değil.
  • OLTP için 3NF, analitik ambarlar için ise bilerek denormalize edilmiş yıldız şeması kullanılır.

Kendini test et

10 soru. Her doğru cevap XP kazandırır.

1 / 10
Öğrenciler ile dersler arasındaki M:N ilişkisi ilişkisel bir veritabanında nasıl kurulur?