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 diyelim. alt kümesi, bağıntının hiçbir geçerli değerinde iki farklı satır üzerinde aynı değerleri taşımıyorsa bir süperanahtardır (superkey). Yani ü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.