sql >> Database >  >> RDS >> Mysql

MySQL - Voorwaardelijke beperkingen voor externe sleutels

Je probeert een ontwerp te maken met de naam Polymorphic Associations . Dat wil zeggen, de externe sleutel kan verwijzen naar rijen in een van de verschillende gerelateerde tabellen.

Maar een externe-sleutelbeperking moet naar precies één tabel verwijzen. U kunt geen externe sleutel declareren die naar verschillende tabellen verwijst, afhankelijk van de waarde in een andere kolom van uw Comments tafel. Dit zou in strijd zijn met verschillende regels voor het ontwerpen van relationele databases.

Een betere oplossing is om een ​​soort "supertabel" te maken waarnaar in de opmerkingen wordt verwezen.

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

Elk van uw inhoudstypen wordt beschouwd als een subtype van deze supertabel. Dit is analoog aan het objectgeoriënteerde concept van een interface .

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

Voordat je een rij kunt invoegen in BlogPosts of UserPictures , moet u een nieuwe rij invoegen in Commentable om een ​​nieuwe pseudokey-ID te genereren. Vervolgens kunt u die gegenereerde id gebruiken als u de inhoud invoegt in de respectievelijke subtypetabel.

Als je dat allemaal hebt gedaan, kun je vertrouwen op referentiële integriteitsbeperkingen.



  1. Draaien met SQL Server 2000

  2. Een Excel-spreadsheet maken vanuit een Oracle-database

  3. JDeveloper gebruiken met MySQL Database en Oracle Database op AWS RDS, deel 3

  4. Een gids voor het partitioneren van gegevens in PostgreSQL