İçeriğe geç
academia.sh

Ders 03 / 14

Anahtarlar

Süperanahtar, aday anahtar, birincil anahtar, alternatif anahtar ve yabancı anahtar tanımları; doğal ile vekil anahtar arasındaki seçim ve anahtar seçim ölçütleri.

İçindekiler

Önceki ders iki kez aynı noktaya çıktı: satırların birbirinden ayırt edilebilmesi gerekiyor ve bu ayırt etme şemada söylenmedikçe gerçekleşmiyor. SQL tablosu, hiçbir şey söylenmezse aynı satırı iki kez kabul eden bir çok kümedir. Bu dersin sorusu şudur: bir satırı tek başına belirleyen sütun kümesi nasıl tanımlanır, birden çok aday varsa hangisi seçilir, ve bir bağıntının satırı başka bir bağıntının satırına nasıl bağlanır?

Süperanahtar ve Aday Anahtar

Bir bağıntının başlığındaki öznitelikler kümesine HH diyelim. KHK \subseteq H alt kümesi, bağıntının hiçbir geçerli değerinde iki farklı satır KK üzerinde aynı değerleri taşımıyorsa bir süperanahtardır (superkey). Yani KK üzerindeki değerler satırı belirler.

Bu tanım fazla cömerttir: bir süperanahtara gereksiz sütun eklemek onu yine süperanahtar bırakır. Üye bağıntısında uye_no satırı belirliyorsa, (uye_no, ad) de belirler. Gereksizliği elemek için indirgeme yapılır: hiçbir öz alt kümesi süperanahtar olmayan bir süperanahtara aday anahtar (candidate key) denir. Aday anahtar, en küçük belirleyici sütun kümesidir.

Bir bağıntının birden çok aday anahtarı olabilir. Üye bağıntısında üye numarası da e-posta adresi de satırı tek başına belirler:

sqlite3 :memory: <<'SQL'
CREATE TABLE uye (
  uye_no       INTEGER PRIMARY KEY,
  eposta       TEXT NOT NULL UNIQUE,
  ad           TEXT NOT NULL,
  kayit_tarihi TEXT NOT NULL
);
INSERT INTO uye VALUES (41, '[email protected]', 'Ayşe Demir', '2024-09-12');
INSERT INTO uye VALUES (52, '[email protected]', 'Ayşe D. Demir', '2025-01-08');
SQL
Runtime error near line 8: UNIQUE constraint failed: uye.eposta (19)

İkinci ekleme farklı bir üye numarası taşımasına rağmen reddedilir, çünkü e-posta adresi de bir aday anahtardır ve o adres zaten kullanılmıştır. Aday anahtarlık, bugünkü veride yinelenme bulunmamasından değil, hiçbir zaman bulunamayacağı kuralından gelir. Bu ayrım önemlidir: veride şu an tekrar etmeyen bir sütun anahtar sanılabilir. Doğru soru “şu anda tekrar ediyor mu” değil, “tekrar etmesi mümkün mü” sorusudur. Kütüphane bağlamında üye adı buna iyi bir örnektir — bugün tekrar etmiyor olması, iki Ayşe Demir’in üye olamayacağı anlamına gelmez.

Birincil ve Alternatif Anahtar

Aday anahtarlardan biri, bağıntının resmî kimliği olarak seçilir; buna birincil anahtar (primary key) denir. Seçilmeyen aday anahtarlara alternatif anahtar (alternate key) denir ve onlar da şemada tekillik kısıtı olarak yazılır — yukarıdaki UNIQUE bunu yapar.

Birincil anahtar seçimi bir tercih meselesidir ve motorun davranışını da etkiler: satırlara başka bağıntılardan yapılan başvurular birincil anahtar üzerinden kurulur, dizin genellikle onun üzerine düşer.

sqlite3 :memory: <<'SQL'
CREATE TABLE uye (
  uye_no INTEGER PRIMARY KEY,
  eposta TEXT NOT NULL UNIQUE,
  ad     TEXT NOT NULL
);
INSERT INTO uye VALUES (41, '[email protected]', 'Ayşe Demir');
INSERT INTO uye VALUES (41, '[email protected]', 'Mert Kaya');
SQL
Runtime error near line 7: UNIQUE constraint failed: uye.uye_no (19)

Bileşik Anahtar

Anahtar tek sütundan oluşmak zorunda değildir. Birden çok sütunun birlikte oluşturduğu anahtara bileşik anahtar (composite key) denir. Kütüphanede bir kitabın fiziksel kopyası — bundan sonra nüsha — üç şeyle belirlenir: hangi kitap, hangi şube, o şubedeki kaçıncı kopya.

sqlite3 :memory: <<'SQL'
CREATE TABLE nusha (
  isbn      TEXT    NOT NULL,
  sube_kodu TEXT    NOT NULL,
  kopya_no  INTEGER NOT NULL,
  PRIMARY KEY (isbn, sube_kodu, kopya_no)
);
INSERT INTO nusha VALUES ('978-975-0000-01-1', 'MRK', 1),
                         ('978-975-0000-01-1', 'MRK', 2),
                         ('978-975-0000-01-1', 'BHC', 1);
INSERT INTO nusha VALUES ('978-975-0000-01-1', 'BHC', 1);
SQL
Runtime error near line 10: UNIQUE constraint failed: nusha.isbn, nusha.sube_kodu, nusha.kopya_no (19)

Aynı kitabın Merkez şubesindeki birinci ve ikinci kopyası ile Bahçelievler şubesindeki birinci kopyası ayrı satırlardır; dördüncü ekleme üçüncüyle çakıştığı için reddedilir. Bileşik anahtarın sütun sırası anahtarlık açısından önemsizdir — küme kümedir — ama dizin davranışı açısından önemlidir; bu ayrım motorun iç yapısını ele alan kurslara aittir.

Doğal ve Vekil Anahtar

Anahtar, alanın kendi verisinden gelebilir ya da kimliklendirme amacıyla üretilmiş olabilir. Alanın kendi verisinden gelene doğal anahtar (natural key) denir: kitabın ISBN’i, şube kodu, üyenin e-posta adresi. Yalnızca satırı ayırt etmek için üretilene vekil anahtar (surrogate key) denir: ödünç işleminin sıra numarası gibi.

sqlite3 :memory: <<'SQL'
.headers on
.mode box
CREATE TABLE odunc (
  odunc_no    INTEGER PRIMARY KEY,
  uye_no      INTEGER NOT NULL,
  alis_tarihi TEXT    NOT NULL
);
INSERT INTO odunc (uye_no, alis_tarihi) VALUES (41, '2025-03-02'), (52, '2025-03-04');
SELECT * FROM odunc;
SQL
┌──────────┬────────┬─────────────┐
│ odunc_no │ uye_no │ alis_tarihi │
├──────────┼────────┼─────────────┤
│ 1        │ 41     │ 2025-03-02  │
│ 2        │ 52     │ 2025-03-04  │
└──────────┴────────┴─────────────┘

Ekleme deyimi odunc_no sütununa değer vermedi; değerler sistem tarafından üretildi. Kimlik sütununun nasıl üretildiği motora göre değişir: kimi motorda ayrı bir sıra üreteci nesnesi tanımlanır, kimi motorda sütun bildiriminde belirtilir, kiminde tablonun gizli satır numarası kullanılır. Üretilen değerlerin boşluksuz artacağı hiçbir motorda güvence değildir; geri alınan bir işlemin tükettiği numara geri gelmez. Vekil anahtarı “kaçıncı kayıt” diye okumak bu yüzden hatalıdır.

Doğal anahtar veriyi anlamlı kılar ve fazladan sütun gerektirmez; buna karşılık alanın kuralları değiştiğinde değişebilir. Vekil anahtar değişmez ve dardır; buna karşılık anlamsızdır, tekilliği kendi başına güvenceye almaz — vekil anahtar konan bir bağıntıda doğal aday anahtar yine de UNIQUE ile yazılmalıdır, yoksa aynı kitap iki farklı numarayla iki kez girilebilir.

Yabancı Anahtar

Bağıntılar birbirine yabancı anahtarla (foreign key) bağlanır: bir bağıntıdaki sütun kümesinin değerleri, başka bir bağıntının aday anahtar değerleri arasında bulunmak zorundadır.

sqlite3 :memory: <<'SQL'
PRAGMA foreign_keys = ON;
CREATE TABLE uye (
  uye_no INTEGER PRIMARY KEY,
  ad     TEXT NOT NULL
);
CREATE TABLE odunc (
  odunc_no    INTEGER PRIMARY KEY,
  uye_no      INTEGER NOT NULL REFERENCES uye (uye_no),
  alis_tarihi TEXT    NOT NULL
);
INSERT INTO uye VALUES (41, 'Ayşe Demir');
INSERT INTO odunc VALUES (1001, 41, '2025-03-02');
INSERT INTO odunc VALUES (1002, 77, '2025-03-04');
SQL
Runtime error near line 13: FOREIGN KEY constraint failed (19)

41 numaralı üye tabloda bulunduğu için ilk ödünç kaydı geçer; 77 numaralı üye bulunmadığı için ikincisi reddedilir. Yabancı anahtar, ilişkisel modelde bağıntıları birbirine bağlayan tek düzenektir — satırlar birbirine işaretçiyle değil, değerle bağlanır. Bu, Veri Yapıları kursundaki bağlı listelerden temel bir ayrılıştır: bağlantı bellek adresine değil, anahtar değerine dayandığı için veritabanı kapatılıp açıldığında, başka bir makineye taşındığında ya da yedekten geri yüklendiğinde geçerliliğini korur.

Anahtar Seçimi Ölçütleri

Aday anahtarlar arasından birincil anahtarı seçerken dört ölçüt işe yarar.

  • Kararlılık. Anahtar değerinin değişmemesi gerekir; ona başvuran her satır o değeri taşır. E-posta adresi bu yüzden kötü bir birincil anahtardır, iyi bir alternatif anahtardır.
  • Darlık. Anahtar, ona başvuran her bağıntıda tekrar eder ve dizinlerde yer kaplar. Üç metin sütunlu bileşik anahtar yerine tek tam sayı, başvuru sayısı arttıkça belirgin fark yaratır.
  • Bölünmezlik. İçinde ayrıştırılabilir bilgi taşıyan anahtar — şube kodu ile yılı birleştiren bir dizgi gibi — kural değiştiğinde bozulur.
  • Gizlilik. Anahtar, dışarıya verilen adreslerde ve bağlantılarda görünür. Kimlik numarası gibi kişisel bir değeri birincil anahtar yapmak, onu görünür kılmayı da beraberinde getirir.

Özet

  • Süperanahtar satırı belirleyen herhangi bir sütun kümesidir; aday anahtar, hiçbir öz alt kümesi süperanahtar olmayan süperanahtardır.
  • Aday anahtarlardan biri birincil anahtar seçilir; kalanlar alternatif anahtar olarak tekillik kısıtıyla yazılır.
  • Anahtarlık bugünkü veriden değil, veriye konan kuraldan gelir; “şu an tekrar etmiyor” anahtarlık kanıtı değildir.
  • Doğal anahtar veriden gelir ve değişebilir; vekil anahtar üretilir ve değişmez, ancak doğal aday anahtarın tekilliğini şemadan kaldırmaz.
  • Yabancı anahtar, satırları adresle değil değerle bağlar; bu yüzden taşıma ve geri yükleme altında geçerliliğini korur.

Sonraki Adım

Bu derste yabancı anahtar tanımlandı ve bir ihlali reddedildi, ama arkasındaki kural adlandırılmadı: neden var olmayan bir üyeye ödünç kaydı yazılamıyor, ve o üye kaydı sonradan silinmek istenirse ne olmalı? Sıradaki ders, anahtarların dayandığı iki bütünlük kuralını — varlık bütünlüğü ile başvuru bütünlüğünü — tanımlar ve silme ile güncelleme durumunda sistemin seçebileceği davranışları gösterir.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat