Jedną z moich ulubionych opcji w PostgreSQL jest dziedziczenie dla TABEL. Wyobraźcie sobie prosty sklep internetowy. Produkty w tym sklepie mają pewien zestaw wspólnych atrybutów, plus kilka związanych tylko z danym typem. Zauważyłem, że w tym przypadku dużo lepiej od generycznego modelu danych sprawdza się mechanizm dziedziczenia.

Zakładamy sobie tabelkę `products`:

CREATE TABLE products (
id int,
name text
-- ... costam jeszcze
);

Teraz chcemy dobrze opisać np. monitory.

CREATE TABLE product_monitors (
max_resolution_x int,
max_resolution_y int
-- ... costam jeszcze
) INHERITS (products) ;

No i co zyskaliśmy w ten sposób ? Moim zdaniem dużo :

  • Kwerendy typu SELECT * FROM products wybiorą nam rekordy zarówno z tabeli `products` jak i `product_monitors` (oraz kolejnych, które dziedziczą po `products`);
  • Wszystkie produkty mają wspólną sekwencję, a przez to pulę unikalnych id;
  • Łatwo można modyfikować zestaw wspólnych atrybutów;
  • W atrybutach dodatkowych nie musimy się przejmować kolizją nazw;
  • Ograniczenia na dozwolone wartości atrybutów są łatwe do opisania przy pomocy mechanizmów wbudowanych w bazie danych (CHECK, CONSTRAINT, typ kolumny). Stanowi to dużą przewagę nad modelem generycznym, dla którego musimy analizować metadane na poziomie aplikacji;