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

Polimorfisme dalam tabel database SQL?

Benar, masalahnya adalah Anda ingin hanya satu objek dari satu sub-tipe untuk mereferensikan baris tertentu dari kelas induk. Mulai dari contoh yang diberikan oleh @Jay S, coba ini:

create table media_types (
  media_type     int primary key,
  media_name     varchar(20)
);
insert into media_types (media_type, media_name) values
  (2, 'TV series'),
  (3, 'movie');

create table media (
  media_id       int not null,
  media_type     not null,
  name           varchar(100),
  description    text,
  url            varchar(255),
  primary key (media_id),
  unique key (media_id, media_type),
  foreign key (media_type) 
    references media_types (media_type)
);

create table tv_series (
  media_id       int primary key,
  media_type     int check (media_type = 2),
  season         int,
  episode        int,
  airing         date,
  foreign key (media_id, media_type) 
    references media (media_id, media_type)
);

create table movies (
  media_id       int primary key,
  media_type     int check (media_type = 3),
  release_date   date,
  budget         numeric(9,2),
  foreign key (media_id, media_type) 
    references media (media_id, media_type)
);

Ini adalah contoh subtipe terpisah yang disebutkan oleh @mike g.

Komentar ulang oleh @Countably Infinite dan @Peter:

INSERT ke dua tabel akan membutuhkan dua pernyataan insert. Tapi itu juga berlaku di SQL setiap kali Anda memiliki tabel anak. Itu hal yang biasa dilakukan.

UPDATE mungkin memerlukan dua pernyataan, tetapi beberapa merek RDBMS mendukung UPDATE multi-tabel dengan sintaks GABUNG, sehingga Anda dapat melakukannya dalam satu pernyataan.

Saat mengkueri data, Anda dapat melakukannya hanya dengan mengkueri media tabel jika Anda hanya membutuhkan informasi tentang kolom umum:

SELECT name, url FROM media WHERE media_id = ?

Jika Anda mengetahui bahwa Anda sedang mengkueri film, Anda bisa mendapatkan informasi spesifik film dengan sekali gabung:

SELECT m.name, v.release_date
FROM media AS m
INNER JOIN movies AS v USING (media_id)
WHERE m.media_id = ?

Jika Anda menginginkan informasi untuk entri media tertentu, dan Anda tidak tahu jenisnya, Anda harus bergabung ke semua tabel subtipe Anda, mengetahui bahwa hanya satu tabel subtipe tersebut yang akan cocok:

SELECT m.name, t.episode, v.release_date
FROM media AS m
LEFT OUTER JOIN tv_series AS t USING (media_id)
LEFT OUTER JOIN movies AS v USING (media_id)
WHERE m.media_id = ?

Jika media yang diberikan adalah film, maka semua kolom di t.* akan menjadi NULL.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tren PostgreSQL Terbaru:Tugas yang Paling Banyak Menghabiskan Waktu &Metrik Penting untuk Dilacak

  2. Bagaimana cara mempercepat penghitungan baris dalam tabel PostgreSQL?

  3. Cara Membuat Daftar Database dan Tabel di PostgreSQL

  4. SQL:Pilih catatan di mana SEMUA catatan yang digabungkan memenuhi beberapa kondisi

  5. Cara mengambil cadangan fungsi hanya di Postgres