"Kế thừa bảng" có nghĩa là một cái gì đó khác với "kế thừa lớp" và chúng phục vụ các mục đích khác nhau.
Postgres là tất cả về định nghĩa dữ liệu. Đôi khi định nghĩa dữ liệu thực sự phức tạp. OOP (theo nghĩa thông thường có màu Java) là về các hành vi phụ thuộc vào các định nghĩa dữ liệu trong một cấu trúc nguyên tử đơn lẻ. Mục đích và ý nghĩa của từ "thừa kế" là khác nhau đáng kể ở đây.
Trong vùng đất OOP, tôi có thể định nghĩa (rất lỏng lẻo với cú pháp và ngữ nghĩa ở đây):
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)
Các bảng cho điều này có thể giống như sau:
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);
Nhưng đâu là những hành vi? Chúng không phù hợp với bất cứ đâu. Đây không phải là mục đích của "đối tượng" như chúng được thảo luận trong thế giới cơ sở dữ liệu, bởi vì cơ sở dữ liệu quan tâm đến dữ liệu, không phải mã thủ tục. Bạn có thể viết các hàm trong cơ sở dữ liệu để thực hiện các phép tính cho bạn (thường là một ý tưởng rất hay, nhưng không thực sự là một cái gì đó phù hợp với trường hợp này) nhưng các hàm không giống với các phương thức - các phương thức như được hiểu ở dạng OOP mà bạn đang nói về là cố tình kém linh hoạt.
Có một điều nữa cần chỉ ra về tính kế thừa như một thiết bị giản đồ: Kể từ Postgres 9.2, không có cách nào để tham chiếu một ràng buộc khóa ngoại trên tất cả các phân vùng / thành viên họ bảng cùng một lúc. Bạn có thể viết kiểm tra để thực hiện việc này hoặc thực hiện theo cách khác, nhưng nó không phải là một tính năng được tích hợp sẵn (nó thực sự gây ra các vấn đề với lập chỉ mục phức tạp, và không ai đã viết các bit cần thiết để làm cho nó tự động). Thay vì sử dụng kế thừa bảng cho mục đích này, thường thì kết hợp tốt hơn trong cơ sở dữ liệu để kế thừa đối tượng là tạo các phần mở rộng giản đồ cho các bảng. Một cái gì đó như thế này:
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);
Bây giờ chúng ta có một tham chiếu chính tắc cho ví dụ của động vật mà chúng ta có thể tin cậy sử dụng làm tham chiếu khóa ngoại và chúng ta có một cột "ilk" tham chiếu đến một bảng định nghĩa xxx_ilk trỏ đến bảng "tiếp theo" của dữ liệu mở rộng ( hoặc cho biết không có nếu ilk là loại chung). Việc viết các hàm bảng, khung nhìn, v.v. chống lại loại lược đồ này dễ dàng đến mức hầu hết các khung ORM thực hiện chính xác loại điều này trong nền khi bạn sử dụng kế thừa lớp kiểu OOP để tạo các họ kiểu đối tượng.