PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Полиморфизъм в таблиците на SQL база данни?

Точно така, проблемът е, че искате само един обект от един подтип да препраща към даден ред от родителския клас. Започвайки от примера, даден от @Jay S, опитайте това:

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

Това е пример за несъвместимите подтипове, споменати от @mike g.

Повторни коментари от @Countably Infinite и @Peter:

INSERT към две таблици ще изисква два оператора за вмъкване. Но това е вярно и в SQL всеки път, когато имате дъщерни таблици. Това е обикновено нещо.

UPDATE може да изисква два израза, но някои марки RDBMS поддържат UPDATE с множество таблици със синтаксис JOIN, така че можете да го направите с един израз.

Когато отправяте заявка към данни, можете да го направите просто като направите заявка за media таблица, ако имате нужда само от информация за общите колони:

SELECT name, url FROM media WHERE media_id = ?

Ако знаете, че правите заявка за филм, можете да получите специфична за филма информация с едно присъединяване:

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

Ако искате информация за даден медиен запис и не знаете какъв тип е той, ще трябва да се присъедините към всичките си таблици с подтипове, като знаете, че само една такава таблица на подтипове ще съвпада:

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 = ?

Ако дадената медия е филм, тогава всички колони в t.* ще бъде 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. Как да закръглим до най-близките X минути с PL/pgSQL?

  2. Деклариране на структурата на кортежа на запис в PL/pgSQL

  3. Как да вляза и да се удостоверя в Postgresql след нова инсталация?

  4. Postgres UTC формат на дата и епоха, инверсия на знака

  5. 7 начина да намерите дублиращи се редове в PostgreSQL, като игнорирате първичния ключ