PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Haruskah saya menambahkan kolom tipe untuk mendesain warisan di postgreSQL?

Tentu Anda dapat melakukan ini misalnya untuk menegakkan bahwa hanya satu sub tabel yang dapat mereferensikan baris tertentu:

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)
);

Sekarang tidak mungkin satu baris di Super_Table dapat direferensikan oleh satu baris di kedua sub tabel. Baris dalam Super_Table harus memiliki 'A' atau 'B' sehingga hanya satu dari sub tabel yang dapat memenuhi referensi kunci asing.

Kembali komentar Anda:

Pemahaman saya adalah bahwa implementasi PostgreSQL INHERITS saat ini memungkinkan sejumlah anomali yang terkait dengan indeks, batasan unik, dan batasan kunci asing. Menggunakan fitur ini rumit dan rawan kesalahan.

Pada dasarnya, karena indeks hanya ada di satu tabel, jika Anda memiliki batasan unik di tabel induk Anda, lalu bagaimana cara menegakkan keunikan itu di atas induk dan semua anaknya? Anak-anak bisa memasukkan nilai ke dalam tabel mereka yang sudah ada di induknya, atau orang tua bisa menyisipkan nilai yang sudah ada di salah satu anak.

Demikian juga kunci asing tidak dapat mereferensikan tabel induk dan/atau turunannya karena tidak jelas baris mana yang dirujuk jika beberapa baris dapat ada di induk/anak dengan kunci utama atau nilai unik yang sama.

Ini adalah batasan INHERITS yang diketahui dan belum terselesaikan di PostgreSQL. Desain yang saya tunjukkan di atas menyelesaikan masalah untuk kunci utama, tetapi tidak untuk kunci unik sekunder.

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. ActiveRecord::StatementInvalid:PG::ReadOnlySqlTransaction:- Basis data Heroku masih hanya dapat dibaca bahkan setelah berhenti mengikuti

  2. Mengganti urutan dengan nomor acak

  3. tidak dapat menerjemahkan nama host postgres ke alamat:Nama atau layanan tidak diketahui

  4. Batasan nilai unik di beberapa kolom

  5. Migrasi Rails + Postgres - mengapa saya menerima kesalahan PG::UndefinedFunction:ERROR:function gen_random_uuid() tidak ada?