sql >> Database >  >> RDS >> PostgreSQL

Polymorfisme in SQL-databasetabellen?

Juist, het probleem is dat u slechts één object van één subtype wilt laten verwijzen naar een bepaalde rij van de bovenliggende klasse. Probeer dit, uitgaande van het voorbeeld van @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)
);

Dit is een voorbeeld van de onsamenhangende subtypes genoemd door @mike g.

Re opmerkingen van @Countably Infinite en @Peter:

INSERT naar twee tabellen zou twee insert-instructies vereisen. Maar dat geldt ook in SQL telkens wanneer u onderliggende tabellen heeft. Het is heel gewoon om te doen.

UPDATE kan twee instructies vereisen, maar sommige merken van RDBMS ondersteunen multi-table UPDATE met JOIN-syntaxis, dus u kunt het in één instructie doen.

Wanneer u gegevens opvraagt, kunt u dit eenvoudig doen door de media . op te vragen tabel als u alleen informatie nodig heeft over de gemeenschappelijke kolommen:

SELECT name, url FROM media WHERE media_id = ?

Als je weet dat je een film zoekt, kun je filmspecifieke informatie krijgen met een enkele join:

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

Als u informatie wilt voor een bepaald media-item, en u weet niet welk type het is, moet u lid worden van al uw subtypetabellen, wetende dat slechts één zo'n subtypetabel zal overeenkomen:

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

Als het gegeven medium een ​​film is,dan alle kolommen in t.* zal NULL zijn.



  1. ERD-notaties in gegevensmodellering

  2. Kennis van het herstellen van verwijderde records in SQL Server

  3. Geautomatiseerde databaseback-up en -herstel implementeren met standaardmiddelen

  4. org.postgresql.util.PSQLException:De kolomindex is buiten bereik:3, aantal kolommen:2