「テーブル継承」は「クラス継承」とは異なる意味を持ち、異なる目的を果たします。
Postgresはすべてデータ定義に関するものです。時には本当に複雑なデータ定義。OOP(一般的なJava色の意味で)は、単一のアトミック構造内のデータ定義に動作を従属させることです。ここでは、「継承」という言葉の目的と意味が大きく異なります。
OOPの土地では、私が定義するかもしれません(ここでは構文とセマンティクスが非常に緩いです):
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);
しかし、行動はどこにありますか?彼らはどこにも適合しません。データベースは手続き型コードではなくデータに関係しているため、これはデータベースの世界で説明されている「オブジェクト」の目的ではありません。データベースに関数を記述して計算を行うこともできますが(多くの場合、非常に良いアイデアですが、この場合に当てはまるものではありません)、関数はメソッドと同じではありません。つまり、話しているOOPの形式で理解されるメソッドです。については意図的に柔軟性が低くなっています。
回路図デバイスとしての継承についてもう1つ指摘することがあります。Postgres9.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);
これで、外部キー参照として確実に使用できる動物のインスタンスの正規参照ができました。また、拡張データの「次の」テーブルを指すxxx_ilk定義のテーブルを参照する「ilk」列があります(または、ilkがジェネリック型自体の場合は存在しないことを示します)。この種のスキーマに対してテーブル関数やビューなどを作成するのは非常に簡単なので、オブジェクト型のファミリを作成するためにOOPスタイルのクラス継承に頼る場合、ほとんどのORMフレームワークはバックグラウンドでまさにこの種のことを行います。