Monday, May 7, 2007 at 12:49:17 pm
by
Pawel Gasiorowski
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;