İletişim

Birincil Anahtar (Primary Key) Nedir?

Kısa tanım

Birincil anahtar (primary key), ilişkisel bir tablodaki her satırı benzersiz biçimde tanımlayan sütun veya sütun grubudur. Değeri boş (NULL) olamaz, iki satırda tekrar edemez ve her tabloda en fazla bir tane bulunur. Veritabanı birincil anahtar için otomatik olarak benzersiz bir indeks oluşturur; diğer tablolar bir satıra yabancı anahtar aracılığıyla bu değer üzerinden başvurur.

Diğer adları: primary key, PK, ana anahtar

Her satırı benzersiz ve boş olamayan bir kimlik sütunuyla tanımlayan birincil anahtarı ve yinelenen değerin reddedildiğini gösteren tablo

Bir birincil anahtardan beklenenler

Birincil anahtar, bir satırın kimliğidir. Veritabanı üç kuralı zorunlu kılar: değer benzersizdir, NULL olamaz ve bir tabloda yalnızca bir birincil anahtar tanımlanabilir (birden fazla sütundan oluşabilir). Bunlara veritabanının zorlamadığı ama tasarımın gerektirdiği dördüncü bir kural eklenir: anahtar değişmemelidir. Başka tablolar bu değeri yabancı anahtar olarak sakladığı, URL'lerde ve önbellek anahtarlarında kullanıldığı için bir kimliği sonradan değiştirmek zincirleme güncellemeler doğurur.

Veritabanı birincil anahtar için otomatik olarak benzersiz bir indeks oluşturur; PostgreSQL'de bu bir B-tree indekstir. MySQL'in InnoDB motorunda ise birincil anahtar bundan da fazlasıdır: tablo verisi fiziksel olarak bu anahtarın sırasına göre saklanır.

Doğal anahtar mı, yapay anahtar mı?

Doğal anahtar, veride zaten var olan ve benzersiz olduğu düşünülen bir değerdir: e-posta adresi, ISBN, vergi numarası. Yapay (surrogate) anahtar ise yalnızca kimlik olsun diye üretilen, iş anlamı taşımayan bir değerdir. Pratikte yapay anahtar çoğu zaman daha güvenlidir, çünkü doğal anahtarlar beklenmedik biçimde değişir: kullanıcı e-postasını günceller, bir kod sisteminin formatı değişir. Kişisel veri içeren bir değeri birincil anahtar yapmak, o veriyi ona başvuran her tabloya, log kaydına ve URL'ye de yaymak anlamına gelir. Yaygın ve sağlam desen, yapay bir birincil anahtarın yanında doğal değeri ayrı bir UNIQUE kısıtıyla korumaktır:

CREATE TABLE customers (
  id         bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  email      text NOT NULL UNIQUE,
  full_name  text NOT NULL
);

-- Ara tabloda bileşik birincil anahtar
CREATE TABLE product_tags (
  product_id bigint NOT NULL REFERENCES products (id),
  tag_id     bigint NOT NULL REFERENCES tags (id),
  PRIMARY KEY (product_id, tag_id)
);

Otomatik artan sayı mı, UUID mi?

SeçenekArtılarıDikkat edilecekler
Otomatik artan tamsayıKüçük (8 bayt), sıralı, okunması kolayKimliği öğrenmek için veritabanına yazmak gerekir; URL'de kayıt sayısını ele verir; ayrı veritabanlarını birleştirirken çakışır
Rastgele UUID (v4)Uygulamada, hatta istemcide üretilebilir; tahmin edilemez16 bayt; rastgele dağıldığı için B-tree indekste parçalanmaya yol açar
Zaman sıralı UUID (v7)UUID'nin avantajlarını sıralı eklemeyle birleştirirOluşturulma zamanını kabaca açığa çıkarır

Tamsayı seçildiğinde 32 bitlik int yerine bigint kullanmak ucuz bir sigortadır; yaklaşık 2,1 milyar sınırına dayanan bir tabloyu canlıda dönüştürmek zahmetlidir. Sıralı kimliklerin URL'de görünmesi tek başına bir güvenlik açığı değildir, ama her istekte kaydın o kullanıcıya ait olup olmadığı yetkilendirme katmanında mutlaka kontrol edilmelidir; aksi hâlde kimliği bir artırarak başkasının verisine ulaşılabilir.

Sık görülen yanlış anlamalar

  • “Kimlikler boşluksuz ilerler.” Geri alınan işlemler ve silinen satırlar sıra numaralarını tüketir; 1, 2, 5, 9 gibi boşluklar normaldir. Fatura numarası gibi kesintisiz olması gereken değerler birincil anahtardan ayrı üretilmelidir.
  • “Birincil anahtar olmadan da olur.” Birincil anahtarı olmayan tablolarda yinelenen satırları ayırt etmek zorlaşır; ORM'ler ve bazı replikasyon araçları da satırı tanımlayacak bir anahtar bekler.
  • “Kimlik bilgi taşısın.” Ülke kodu veya tarih gömülen anahtarlar, o bilgi değiştiğinde anlamını yitirir. İş anlamı ayrı sütunlarda durmalıdır.

Birincil anahtar seçimi, veritabanı şeması tasarımında sonradan değiştirilmesi en pahalı kararlardan biridir; bu yüzden ilk tablolarda üzerinde durmaya değer.

İlgili terimler

← Sözlüğe dön