PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Tôi có nên thêm một cột kiểu để thiết kế kế thừa trong postgreSQL không?

Chắc chắn bạn có thể làm điều này chẳng hạn để thực thi rằng chỉ một bảng con có thể tham chiếu đến một hàng nhất định:

CREATE TABLE Super_Table (
  super_id SERIAL PRIMARY KEY,
  sub_type CHAR(1) NOT NULL,
  UNIQUE KEY (super_id, sub_type) 
);

CREATE TABLE Sub_Table_A (
  super_id PRIMARY KEY,
  sub_type CHAR(1) NOT NULL,
  CHECK (sub_type = 'A'),
  FOREIGN KEY (super_id, sub_type) REFERENCES Super_Table (super_id, sub_type)
);

CREATE TABLE Sub_Table_B (
  super_id PRIMARY KEY,
  sub_type CHAR(1) NOT NULL,
  CHECK (sub_type = 'B'),
  FOREIGN KEY (super_id, sub_type) REFERENCES Super_Table (super_id, sub_type)
);

Giờ đây, không có cách nào để một hàng trong Super_Table có thể được tham chiếu bởi một hàng trong cả hai bảng phụ. Hàng trong Super_Table phải có 'A' hoặc 'B' và do đó chỉ một trong các bảng con có thể đáp ứng tham chiếu khóa ngoại.

Nhận xét lại của bạn:

Sự hiểu biết của tôi là việc triển khai PostgreSQL hiện tại của INHERITS cho phép một số điểm bất thường liên quan đến chỉ mục, hằng số duy nhất và các ràng buộc khóa ngoại. Sử dụng tính năng này rất phức tạp và dễ xảy ra lỗi.

Về cơ bản, bởi vì các chỉ mục chỉ tồn tại trên một bảng duy nhất, nếu bạn có một ràng buộc duy nhất trên bảng mẹ của mình thì làm thế nào nó có thể thực thi tính duy nhất đó đối với bảng cha và tất cả các bảng con của nó? Phần tử con có thể chèn các giá trị vào bảng của chúng đã tồn tại trong bảng cha hoặc cha mẹ có thể chèn một giá trị đã tồn tại vào một trong các bảng con.

Tương tự như vậy, các khóa ngoại không thể tham chiếu đến bảng mẹ và / hoặc bảng con của nó vì không rõ ràng hàng nào được tham chiếu nếu nhiều hàng có thể tồn tại trong bảng mẹ / con có cùng khóa chính hoặc giá trị duy nhất.

Đây là những hạn chế đã biết và chưa được giải quyết của INHERITS trong PostgreSQL. Thiết kế mà tôi đã trình bày ở trên giải quyết được sự cố cho khóa chính, nhưng không giải quyết được vấn đề cho các khóa duy nhất thứ cấp.

http://archives.postgresql.org/pgsql-hackers/2010 -05 / msg00285.php




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tên bảng dưới dạng tham số hàm PostgreSQL

  2. Bảng trả về thủ tục được lưu trữ Postgresql tất cả các cột

  3. Tốt hơn là tạo chỉ mục trước khi điền vào bảng với dữ liệu hay sau khi dữ liệu được đặt đúng vị trí?

  4. Không thể tạo dịch vụ được yêu cầu [org.hibernate.engine.jdbc.env.spi.JdbcEnosystem]

  5. Tính giờ làm việc giữa 2 ngày trong PostgreSQL