SEN2104 · 3. hafta · Introduction to Relational Data Model

İlişkisel model, anahtarlar ve ER'den tabloya

İlişki, şema, örnek, domain; super/candidate/primary/foreign key; referans bütünlüğü ve ER diyagramını tablolara çevirme kuralları. Hem cebir hem SQL soruları bu tablolara dayanır.

relationtupleattributedomainatomicrelation schemarelation instancedegreecardinalitysuperkeycandidate keyprimary keyforeign keyreferential integrityschema diagramNULL

ER diyagramı kağıt üzerindeki tasarımdı. İlişkisel model (relational model) onun bilgisayardaki karşılığı: her şey tablo. Bu hafta iki şey öğreniyorsun. Birincisi terminoloji ve anahtarlar; ilişkisel cebir, SQL ve normalizasyon bu kavramların üzerine kurulu, “candidate key nedir” bilmeden 9. haftayı geçemezsin. İkincisi ER’den tabloya çevirme kuralları; vizede neredeyse her yıl “bu diyagramı ilişki şemalarına dönüştür” sorusu çıkar.

Altın kurallar:

  1. Şema sabit, örnek değişken. Kısıtlar şemaya aittir.
  2. Anahtar minimal olmalı. Fazladan öznitelik varsa süper anahtardır, aday değil.
  3. FK başvurduğu satırın var olmasını şart koşar. Ya değer gerçek bir PK’ya eşittir ya NULL’dır.
  4. M:N her zaman ayrı tablo. 1:N, N tarafına kolon olur.

Terminoloji

İlişkisel modelde veri tablolarda durur. Matematiksel adıyla tablo bir ilişkidir (relation), satır bir tuple, kolon bir özniteliktir (attribute). Kursta kullandığımız student ilişkisi:

stu_idnamedept_nametot_cred
S1AdaCS60
S2BoraCS30
S3CemEE45
S4DefneMATH90
S5EceCS15
S6FiratEE0
S7GizemNULL10
  • Domain: bir özniteliğin alabileceği değerler kümesi. tot_cred için negatif olmayan tam sayılar.
  • Atomiklik (atomicity): her hücrede tek, bölünmez bir değer. Bir hücreye “555-0101, 555-0102” yazmak ilişkisel modeli bozar; bu, 1NF’nin (9. hafta) temelidir.
  • NULL: değer bilinmiyor ya da yok. S7’nin bölümü henüz belli değil.
  • Derece (degree): öznitelik sayısı, burada 4. Kardinalite: tuple sayısı, burada 7.

İlişki bir kümedir: satırların sırası yoktur ve iki aynı satır olamaz. Kolon sırası da teoride önemsizdir, çünkü öznitelikler isimle çağrılır.

Şema ve örnek

İlişki şeması (relation schema), ilişkinin yapısıdır: student(stu_id, name, dept_name, tot_cred). İlişki örneği (relation instance), belli bir andaki satırlardır. Programlamadaki karşılığı: şema değişken tipi, örnek değişkenin o anki değeri. Ada mezun olunca örnek değişir, şema aynı kalır.

Tüm kurs boyunca kullanacağımız şemalar:

department (dept_name, building, budget)
instructor (inst_id, name, dept_name -> department, salary)
student    (stu_id, name, dept_name -> department, tot_cred)
course     (course_id, title, dept_name -> department, credits)
teaches    (inst_id -> instructor, course_id -> course)
takes      (stu_id -> student, course_id -> course, grade)

Altı çizili yazamadığımız için birincil anahtar ilk kolon(lar); teaches ve takes için ilk iki kolon birlikte. Ok -> foreign key’in nereye baktığını gösterir. Şema diyagramında (schema diagram) her tablo bir kutu, PK altı çizili, FK’lar başvurdukları tablonun PK’sına okla bağlanır.

Anahtarlar

Süper anahtar (superkey): değerleri her satırı tekil belirleyen öznitelik kümesi. student için {stu_id}, {stu_id, name}, {stu_id, name, dept_name, tot_cred} hepsi süper anahtar.

Aday anahtar (candidate key): minimal süper anahtar, yani hiçbir özniteliği çıkarılamayan. {stu_id} aday; {stu_id, name} değil, çünkü name’i atınca hâlâ anahtar.

Birincil anahtar (primary key): tasarımcının aday anahtarlar arasından seçtiği. Bir ilişkinin birden fazla aday anahtarı olabilir (öğrenci numarası ve TC kimlik no); birini PK seçersin, diğerine UNIQUE koyarsın.

Yabancı anahtar (foreign key): bir ilişkideki öznitelik(ler)in, başka (ya da aynı) ilişkinin PK’sına başvurması. takes.stu_id → student.stu_id. Başvuran ilişki referencing, başvurulan referenced relation.

Örnekten anahtar okumak

Bir kümenin örnekte tekrar içerip içermediğine SQL ile bakabilirsin:

SELECT stu_id, course_id FROM takes
GROUP BY stu_id, course_id HAVING COUNT(*) > 1;   -- boş: tekrar yok
SELECT stu_id, grade FROM takes
GROUP BY stu_id, grade HAVING COUNT(*) > 1;       -- 3 grup tekrarlı
(ilk sorgu: satır yok)
S1 | A
S1 | B
S4 | A

TUZAK · örnek veri anahtar ispatlamaz. name şu anki 7 öğrencide tekrarsız, ama anahtar değil: ikinci bir “Ada” kaydolabilir. Örnek ancak olumsuz kanıt verir: dept_name tekrarlı (CS üç kez), o halde kesinlikle anahtar değil. Sınavda “this instance” ile “the schema” ayrımına dikkat.

Süper anahtar sayma

Bir öznitelik kümesi, en az bir aday anahtarı içeriyorsa süper anahtardır. R(A, B, C, D) için tek aday anahtar {A} ise geri kalan üç öznitelik istediğin gibi eklenir: 23=82^3 = 8 süper anahtar. İki aday anahtar {A} ve {B, C} varsa içerme-dışarma uygula:

∣SA∪SBC∣=23+22−21=8+4−2=10|S_A \cup S_{BC}| = 2^3 + 2^2 - 2^1 = 8 + 4 - 2 = 10

Son terim hem A’yı hem B,C’yi içerenler: {A,B,C} ve {A,B,C,D}.

Bütünlük kısıtları ve referans bütünlüğü

  • Varlık bütünlüğü (entity integrity): PK değeri tekrar edemez ve NULL olamaz.
  • Referans bütünlüğü (referential integrity): FK değeri ya NULL’dır ya da başvurulan tabloda gerçekten var olan bir PK değeridir.

Örnek veritabanında PRAGMA foreign_keys = ON ile denediklerimiz:

İşlemSonuçNeden
INSERT INTO takes VALUES ('S9','CS101','A')reddedildiS9 diye öğrenci yok
INSERT INTO instructor VALUES ('I7','Ozturk','PHYS',65000)reddedildiPHYS bölümü yok
INSERT INTO student VALUES ('S8','Hakan',NULL,0)kabulFK NULL olabilir
INSERT INTO student VALUES ('S1','Zeynep','CS',0)reddedildiPK tekrarı
DELETE FROM department WHERE dept_name='CS'reddedildihoca, öğrenci, ders CS’ye başvuruyor
S5’in takes satırlarını silip sonra S5’i silmekkabulartık başvuran yok

Başvurulan satır silinirken ne olacağını FK tanımında seçersin: varsayılan NO ACTION/RESTRICT reddeder, ON DELETE CASCADE başvuranları da siler, ON DELETE SET NULL FK’yı NULL yapar.

TUZAK · SQLite ve NULL birincil anahtar. Standart SQL’de PK asla NULL olamaz. SQLite tarihsel bir hata yüzünden TEXT PRIMARY KEY kolonuna NULL kabul ediyor (doğrulamada denendi); NOT NULL eklersen reddeder. Ayrıca SQLite’ta FK kontrolü varsayılan kapalıdır, PRAGMA foreign_keys = ON gerekir. PostgreSQL ve MySQL (InnoDB) bunları kendiliğinden uygular.

ER’den ilişkisel şemaya çevirme kuralları

ER yapısıTabloya nasıl geçer
Güçlü varlıkKendi tablosu; basit öznitelikler kolon, anahtar PK
Bileşik öznitelikSadece yaprak parçalar kolon: name → first_name, last_name
Çok değerli öznitelikAyrı tablo: inst_phone(inst_id, phone), PK ikisi birden, inst_id FK
Türetilmiş öznitelikKolon olmaz (gerekirse view ile hesaplanır)
Zayıf varlıkTablo; sahip PK’sı FK olarak eklenir, PK = sahip PK + discriminator
Tanımlayıcı ilişkiTablo olmaz, zayıf varlığın tablosunda zaten var
1:N ilişkiN tarafına “1” tarafın PK’sı FK kolonu olarak; ilişki öznitelikleri de N tarafına
Total katılım (N tarafı)O FK kolonu NOT NULL
1:1 ilişkiBir tarafa FK + UNIQUE (tercihen total katılan tarafa), ya da ayrı tablo
M:N ilişkiAyrı tablo: iki PK + ilişki öznitelikleri, PK = iki PK birleşimi
n’li (ternary) ilişkiAyrı tablo: tüm katılımcıların PK’ları

Çözümlü örnek

Senaryo: department; instructor (bileşik name, çok değerli phone, bölüme N:1 total); student (bir danışman hoca, 1:N); course; section (course’un zayıf varlığı); takes (student ile section arasında M:N, grade); dean (department ile instructor arasında 1:1, ayrı tabloda tutulacak).

department (dept_name, building)
instructor (inst_id, first_name, last_name, dept_name -> department NOT NULL)
inst_phone (inst_id -> instructor, phone)                         PK: ikisi
student    (stu_id, name, advisor_id -> instructor)
course     (course_id, title)
section    (course_id -> course, sec_id, semester, year)          PK: dördü
takes      (stu_id -> student, course_id, sec_id, semester, year, grade)
           PK: ilk beşi ; FK (course_id, sec_id, semester, year) -> section
dean       (dept_name -> department, inst_id -> instructor UNIQUE) PK: dept_name

Toplam 8 tablo. Şemayı SQLite’ta kurup denedik: olmayan şubeye kayıt bileşik FK yüzünden reddedildi, aynı hocayı iki bölüme dekan yapmak UNIQUE yüzünden reddedildi, bölümsüz hoca NOT NULL yüzünden reddedildi, ders silinince şubeleri CASCADE ile gitti.

Dikkat: takes bir section’a bağlandığı için FK dört kolonlu bir bileşik anahtardır. FK, başvurduğu PK’nın tüm kolonlarını içermek zorunda; sadece course_id’yi section’a bağlayamazsın.

Specialization için üç yol

person(pid, name) → student(tot_cred), employee(salary):

YöntemTablolarNe zaman
1. Üst + alt tablolarperson(pid, name), student(pid, tot_cred), employee(pid, salary)Her durumda çalışır; alt tabloların pid’si person’a FK
2. Sadece alt tablolarstudent(pid, name, tot_cred), employee(pid, name, salary)Sadece total ve disjoint ise
3. Tek tabloperson(pid, name, ptype, tot_cred, salary)Az alt küme varsa; ilgisiz kolonlar NULL

Yöntem 2 overlapping’de aynı kişinin name’ini iki kez saklar, partial’da hiçbir alt kümede olmayan kişiyi saklayamaz.

Sık yapılan hatalar

Yanlış düşünceDoğrusu
Derece = satır sayısıDerece kolon, kardinalite satır sayısı
{stu_id, name} aday anahtarSüper anahtar; minimal değil
Örnekte tekrar yok, o halde anahtarKısıt şemaya ait; örnek sadece çürütür
FK NULL olamazOlabilir; PK olamaz
FK aynı isimde olmalıİsim serbest (advisor_id → inst_id); tip ve değer uyuşmalı
M:N ilişkiyi bir tarafa kolon olarak koyAyrı tablo şart
1:N’de FK’yı “1” tarafına koyN tarafına; yoksa bir hücreye çok değer gerekir
Çok değerli phone’u virgülle tek kolona yazAtomiklik bozulur; ayrı tablo
Zayıf varlığın PK’sı sadece discriminatorSahip PK + discriminator
1:1’de FK yeterFK + UNIQUE; yoksa 1:N olur

Kendini test et

Sınavdaki gibi İngilizce sorular. Önce kâğıt kalemle çöz, sonra cevabı aç.

Soru 1kolay

What are the degree and the cardinality of the student relation in the sample database?

Cevabı göster
degree 4, cardinality 7

Derece (degree) = öznitelik sayısı: stu_id, name, dept_name, tot_cred → 4. Kardinalite = satır (tuple) sayısı: S1'den S7'ye → 7. İkisini karıştırma: derece şemaya, kardinalite örneğe (instance) bağlı.

Soru 2kolay

In student(stu_id, name, dept_name, tot_cred), stu_id is the primary key. Is {stu_id, name} a superkey? Is it a candidate key?

Cevabı göster
superkey: yes; candidate key: no

stu_id zaten her satırı tekil belirliyor; yanına ne eklersen ekle hâlâ tekil: süper anahtar. Aday anahtar ise minimal olmalı. name'i çıkarınca kalan {stu_id} hâlâ anahtar, demek ki {stu_id, name} minimal değil.

Soru 3orta

In the current student instance no two students have the same name. Can we declare name a candidate key?

Cevabı göster
no

Anahtar şemanın bir kısıtıdır ve gelecekteki tüm geçerli örnekler için doğru olmalı. Yarın ikinci bir "Ada" kaydolabilir. Doğrulamada name bu örnekte tekrarsız çıktı, ama bu tesadüf. Örnek veri ancak bir şeyin anahtar olmadığını gösterebilir (dept_name tekrarlı, o yüzden anahtar olamaz).

Soru 4kolay

What is the primary key of takes(stu_id, course_id, grade)? Explain why neither attribute alone works.

Cevabı göster
{stu_id, course_id}

stu_id tekrarlı (S1 dört satırda), course_id tekrarlı (CS101 dört satırda). Çift (stu_id, course_id) örnekte tekrarsız ve iş kuralı da "bir öğrenci bir dersi bir kez alır". grade eklemek gereksiz, (stu_id, grade) ise tekrarlı (S1 iki tane A almış).

Soru 5orta

A relation R(A, B, C, D) has exactly two candidate keys: {A} and {B, C}. How many superkeys does R have?

Cevabı göster
10

A'yı içeren alt kümeler: geri kalan B, C, D serbest → 2^3 = 8. {B,C}'yi içerenler: A ve D serbest → 2^2 = 4. İkisini birden içerenler ({A,B,C} ve {A,B,C,D}) iki kez sayıldı → 2. İçerme-dışarma: 8 + 4 − 2 = 10.

Soru 6orta

With foreign keys enforced, which statement is rejected?

  1. INSERT INTO student VALUES ('S8','Hakan',NULL,0)
  2. INSERT INTO takes VALUES ('S9','CS101','A')
  3. INSERT INTO takes VALUES ('S6','BI100',NULL)
  4. UPDATE student SET tot_cred = 20 WHERE stu_id = 'S7'
Cevabı göster
INSERT INTO takes VALUES ('S9','CS101','A')

takes.stu_id, student.stu_id'ye başvuruyor (foreign key). S9 adında öğrenci yok: referans bütünlüğü ihlali. dept_name'i NULL olan öğrenci eklemek serbest, çünkü FK değeri NULL olabilir. S6 ve BI100 ikisi de var. tot_cred anahtar değil.

Soru 7orta

What happens to DELETE FROM department WHERE dept_name = 'CS'; if foreign keys are enforced with the default action?

Cevabı göster
rejected, because instructor, student and course rows reference CS

Varsayılan davranış (NO ACTION / RESTRICT) başvurulan satırın silinmesine izin vermez. CS'ye I1, I2 (instructor), S1, S2, S5 (student) ve CS101, CS201, CS305 (course) başvuruyor. Silmek istersen önce onları silmeli ya da FK'yı ON DELETE CASCADE / SET NULL ile tanımlamalısın.

Soru 8orta

Map the M:N relationship takes between student(stu_id, ...) and course(course_id, ...) with relationship attribute grade to a relation schema. Give the primary key and the foreign keys.

Cevabı göster
takes(stu_id, course_id, grade), PK (stu_id, course_id), FK stu_id → student, FK course_id → course

M:N ilişki her zaman ayrı tablo olur. Kolonlar: iki tarafın birincil anahtarları + ilişkinin öznitelikleri. Birincil anahtar iki tarafın anahtarlarının birleşimi; her biri kendi tablosuna FK.

Soru 9orta

Map the weak entity set section (discriminator: sec_id, semester, year; attribute room) owned by course(course_id, ...).

Cevabı göster
section(course_id, sec_id, semester, year, room), PK (course_id, sec_id, semester, year), FK course_id → course

Zayıf varlığın tablosu sahibin PK'sını FK olarak alır. PK = sahip PK + discriminator. Tanımlayıcı ilişki (sec_course) ayrı tablo olmaz, bilgisi zaten section'daki course_id'de. Sahip silinince şube anlamsız olduğundan FK genelde ON DELETE CASCADE tanımlanır.

Soru 10zor

An ER design has the strong entities department, instructor (composite name, multivalued phone), student and course; the weak entity section (owner course); the relationships inst_dept (N:1, instructor total), advisor (1:N, instructor to student), takes (M:N between student and section) and dean (1:1 between department and instructor). Fold every 1:N / N:1 relationship into the N side, but keep dean as its own table. How many tables do you get?

Cevabı göster
8

Varlıklar: department, instructor, student, course, section → 5. Çok değerli phone → inst_phone → 6. takes M:N → 7. dean ayrı tablo → 8. inst_dept, instructor'a dept_name NOT NULL kolonu olarak girer (total katılım NOT NULL demek). advisor, student'a advisor_id kolonu olur. sec_course, section'daki course_id ile temsil edilir. Bileşik name kolonlara bölünür (first_name, last_name), tablo eklemez. Şema SQLite'ta kurulup 8 tablo sayıldı.

Soru 11zor

In the design above, dean is a 1:1 relationship between department and instructor stored as dean(dept_name, inst_id). Which constraints make it truly 1:1?

Cevabı göster
dept_name PRIMARY KEY and inst_id UNIQUE (both foreign keys)

dept_name PK: bir bölümün en çok bir dekanı. inst_id UNIQUE: bir hoca en çok bir bölümün dekanı. Sadece birini koyarsan ilişki 1:N olur. Doğrulamada aynı hocayı ikinci bölüme dekan yapmak UNIQUE yüzünden reddedildi.

Soru 12zor

person(pid, name) is specialized into student(tot_cred) and employee(salary), and the specialization is total and disjoint. Which mapping uses the fewest tables without NULL columns, and why is it unsafe if the specialization were overlapping?

Cevabı göster
two tables student(pid, name, tot_cred) and employee(pid, name, salary); overlapping would store name twice

Yöntem 1: person + her alt küme (3 tablo, alt tablolar pid ile üste FK). Yöntem 2: sadece alt kümeler, her biri üst özniteliklerini kopyalar (2 tablo). Yöntem 3: tek tablo + tip kolonu (1 tablo ama ilgisiz kolonlar NULL). Total ve disjoint ise yöntem 2 her kişiyi tam bir tabloda tutar, NULL yok. Overlapping olsaydı hem öğrenci hem çalışan olan kişinin name'i iki tabloda tekrar eder ve tutarsızlaşabilir; partial olsaydı hiçbir alt kümede olmayan kişi hiçbir yerde saklanamazdı.

Doğrulama: Örnek üniversite veritabanı node:sqlite ile kuruldu. Anahtar iddiaları GROUP BY ... HAVING COUNT(*) > 1 ile, FK ihlalleri PRAGMA foreign_keys=ON altında gerçek INSERT/DELETE ile, süper anahtar sayıları JS alt küme sayımıyla, ER eşlemeleri SQLite'ta şema kurulup tablo sayılarak denetlendi (verify/SEN2104/03.mjs, 32 kontrol).

Deftere not kartı

Relation = tablo, tuple = satır, attribute = kolon, domain = izinli değerler (atomik). Schema = yapı (değişmez), instance = o anki satırlar (değişir). Degree = kolon sayısı, cardinality = satır sayısı. Superkey: satırı tekil belirler. Candidate key: minimal superkey. Primary key: seçilen aday. Anahtar şemanın kısıtı: örnek veri anahtar olduğunu ispatlamaz, olmadığını gösterebilir. Superkey sayısı: {A} anahtarsa R(ABCD)'de 2^3 = 8; iki anahtarda içerme-dışarma. FK: başka tablonun PK'sına başvurur, NULL olabilir, başvurulan satır yoksa INSERT reddedilir. Başvurulan satırı silmek: varsayılan RESTRICT; ya CASCADE ya SET NULL tanımla. ER -> tablo: güçlü varlık = tablo; bileşik = yaprak kolonlar; çok değerli = ayrı tablo (id, değer). Zayıf: sahip PK + discriminator = PK, sahip PK'sı FK (CASCADE). 1:N -> N tarafına FK kolonu. Total katılım -> NOT NULL. M:N -> ayrı tablo, PK = iki PK'nın birleşimi. 1:1 -> FK + UNIQUE. Specialization: üst+alt (3) / sadece alt (total+disjoint) / tek tablo + tip.