sql >> Database teknologi >  >> RDS >> Mysql

MySQL - Betingede udenlandske nøglebegrænsninger

Du forsøger at lave et design, der kaldes Polymorfe associationer . Det vil sige, at den fremmede nøgle kan referere til rækker i en hvilken som helst af flere relaterede tabeller.

Men en fremmednøgle-begrænsning skal referere til nøjagtig én tabel. Du kan ikke erklære en fremmednøgle, der refererer til forskellige tabeller afhængigt af værdien i en anden kolonne i dine Comments bord. Dette ville overtræde adskillige regler for relationel databasedesign.

En bedre løsning er at lave en slags "supertabel", som kommentarerne refererer til.

CREATE TABLE Commentable (
  id SERIAL PRIMARY KEY
);

CREATE TABLE Comments (
  comment_id SERIAL PRIMARY KEY,
  foreign_id INT NOT NULL,
  ...
  FOREIGN KEY (foreign_id) REFERENCES Commentable(id)
);

Hver af dine indholdstyper vil blive betragtet som en undertype af denne supertabel. Dette er analogt med det objektorienterede koncept med en grænseflade .

CREATE TABLE BlogPosts (
  blogpost_id INT PRIMARY KEY, -- notice this is not auto-generated
  ...
  FOREIGN KEY (blogpost_id) REFERENCES Commentable(id)
);

CREATE TABLE UserPictures (
  userpicture_id INT PRIMARY KEY, -- notice this is not auto-generated
  ...
  FOREIGN KEY (userpicture_id) REFERENCES Commentable(id)
);

Før du kan indsætte en række i BlogPosts eller UserPictures , skal du indsætte en ny række til Commentable for at generere et nyt pseudonøgle-id. Så kan du bruge det genererede id, når du indsætter indholdet i den respektive undertypetabel.

Når du har gjort alt det, kan du stole på referenceintegritetsbegrænsninger.



  1. Udførelsesrækkefølge for betingelser i SQL 'where'-sætning

  2. 4 måder at kontrollere for duplikerede rækker i SQL Server

  3. Sådan arbejder du med PostgreSQL-databaser

  4. Skjulte funktioner i PostgreSQL