"Наслідування таблиці" означає щось інше, ніж "успадкування класу", і вони слугують різним цілям.
Postgres - це все про визначення даних. Іноді справді складні визначення даних. OOP (у загальноприйнятому для Java розумінні речей) - це підпорядкування поведінки визначенням даних в одній атомній структурі. Призначення і значення слова «спадщина» тут суттєво різняться.
В ООП землі я міг би визначити (будучи тут дуже вільним із синтаксисом та семантикою):
import life
class Animal(life.Autonomous):
metabolism = biofunc(alive=True)
def die(self):
self.metabolism = False
class Mammal(Animal):
hair_color = color(foo=bar)
def gray(self, mate):
self.hair_color = age_effect('hair', self.age)
class Human(Mammal):
alcoholic = vice_boolean(baz=balls)
Таблиці для цього можуть виглядати так:
CREATE TABLE animal
(name varchar(20) PRIMARY KEY,
metabolism boolean NOT NULL);
CREATE TABLE mammal
(hair_color varchar(20) REFERENCES hair_color(code) NOT NULL,
PRIMARY KEY (name))
INHERITS (animal);
CREATE TABLE human
(alcoholic boolean NOT NULL,
FOREIGN KEY (hair_color) REFERENCES hair_color(code),
PRIMARY KEY (name))
INHERITS (mammal);
Але де поведінка? Вони нікуди не поміщаються. Це не мета "об'єктів", як вони обговорюються у світі баз даних, оскільки бази даних стосуються даних, а не процесуального коду. Ви можете писати функції в базі даних, щоб робити для вас обчислення (часто дуже гарна ідея, але насправді не те, що підходить для цього випадку), але функції - це не те саме, що методи - методи, зрозумілі у формі ООП, про який ви говорите приблизно навмисно менш гнучкі.
Існує ще одна річ, на яку слід звернути увагу щодо успадкування як схематичного пристрою: станом на Postgres 9.2 немає жодного способу посилатися на обмеження зовнішнього ключа для всіх членів сімейства розділів / таблиці одночасно. Ви можете писати чеки, щоб зробити це, або обійти це іншим способом, але це не вбудована функція (насправді це зводиться до проблем зі складною індексацією, і ніхто не написав біти, необхідні для автоматичного здійснення). Замість того, щоб використовувати для цієї мети успадкування таблиці, часто кращим збігом у базі даних для успадкування об’єктів є створення схематичних розширень таблиць. Щось на зразок цього:
CREATE TABLE animal
(name varchar(20) PRIMARY KEY,
ilk varchar(20) REFERENCES animal_ilk NOT NULL,
metabolism boolean NOT NULL);
CREATE TABLE mammal
(animal varchar(20) REFERENCES animal PRIMARY KEY,
ilk varchar(20) REFERENCES mammal_ilk NOT NULL,
hair_color varchar(20) REFERENCES hair_color(code) NOT NULL);
CREATE TABLE human
(mammal varchar(20) REFERENCES mammal PRIMARY KEY,
alcoholic boolean NOT NULL);
Тепер у нас є канонічне посилання на екземпляр тварини, яке ми можемо надійно використовувати як посилання на зовнішній ключ, і ми маємо стовпець "ilk", який посилається на таблицю визначень xxx_ilk, яка вказує на "наступну" таблицю розширених даних ( або вказує, що його немає, якщо ilk є самим родовим типом). Написати функції таблиці, подання тощо для такого роду схем настільки просто, що більшість фреймворків ORM роблять саме такі речі у фоновому режимі, коли вдаються до успадкування класу в стилі ООП для створення сімейств типів об'єктів.