4.5. Kalıtım

Kalıtım (miras alma), nesne yönelimli veritabanlarından kaynaklanan bir kavramdır. Bu sayede veritabanı tasarımında ilginç ve yeni olasılıkların yolu açılmıştır.

İki tablo oluşturalım: Bir iller tablosu ile bir başkentler tablosu. Doğal olarak, başkentler aynı zamanda ildir, dolayısıyla illeri listelerken dolaylı olarak başkentleri de bir şekilde göstermek isteriz. Biraz akıllıca hareket ederek, şöyle bir şema kullanabilirsiniz:

CREATE TABLE başkentler (
  ad         text,
  nüfus      real,
  yükseklik  int,    -- (metre cinsinden)
  ülke       char(2)
);

CREATE TABLE kentler (
  ad         text,
  nüfus      real,
  yükseklik  int     -- (metre cinsinden)
);

CREATE VIEW iller AS
  SELECT ad, nüfus, yükseklik FROM başkentler
    UNION
  SELECT ad, nüfus, yükseklik FROM kentler;

Çok fazla sorgulamadan bu doğru çalışır, fakat, bazı satırları güncellemek istediğinizde tuhaf şeyler olur.

Bu daha iyi bir çözümdür:

CREATE TABLE iller (
  ad         text,
  nüfus      real,
  yükseklik  int     -- (metre cinsinden)
);

CREATE TABLE başkentler (
  ülke      char(2) UNIQUE NOT NULL
) INHERITS (iller);

Bu durumda başkentler tablosu, iller tablosundaki bütün sütunları (ad, nüfus ve yükseklik) miras alacaktır. ad sütununun türü text olup, değişken uzunlukta dizge kabul eden bir PostgreSQL türüdür. başkentler tablosu ek bir sütuna, ülke kısaltmasını gösteren ülke sütununa sahiptir. PostgreSQL'de bir tablo, sıfır ya da daha fazla tablo miras alabilir.

Örneğin, aşağıdaki sorgu, tüm illerin isimleri arasından başkentler de dahil 500 metre'den daha yüksekteki illeri bulmaktadır:

SELECT ad, yükseklik
  FROM iller
 WHERE yükseklik > 500;

Sorgu şöyle dönecektir:

   ad    | yükseklik
---------+----------
 Erzurum |      1900
 Bitlis  |      1500
 Ankara  |       850
(3 satır)

Aşağıdaki sorgu ise, ülke başkenti olmayan illerden 500 metre ve daha yüksekte olan illeri bulmaktadır:

SELECT ad, yükseklik
  FROM ONLY iller
 WHERE yükseklik > 500;

Çıktısı:

   ad    | yükseklik
---------+----------
 Erzurum |      1900
 Bitlis  |      1500
(2 satır)

Buradaki ONLY deyimi sorgunun sadece iller tablosunda yapılacağını iller tablosunu miras alan tablolarda yapılmayacağını belirtir. Daha önce bahsedilen SELECT, UPDATE ve DELETE cümleleri de dahil olmak üzere pek çok SQL cümlesi ONLY deyimini destekler.

Bilginize

Kalıtım yeterince kullanışlı olduğundan, kullanışlılığını sınırlayan tekil kısıtlar ve anahtarlar ile bütünleştirilmemiştir. Daha fazla bilgi güncel PostgreSQL belgelerindeki Inheritance bölümünde bulunabilir.