sql >> Databáze >  >> RDS >> Mysql

MySQL – podmíněná omezení cizích klíčů

Pokoušíte se vytvořit návrh, který se nazývá Polymorfní asociace . To znamená, že cizí klíč může odkazovat na řádky v kterékoli z několika souvisejících tabulek.

Ale omezení cizího klíče musí odkazovat přesně na jednu tabulku. Nemůžete deklarovat cizí klíč, který odkazuje na různé tabulky v závislosti na hodnotě v jiném sloupci vašich Comments stůl. To by porušilo několik pravidel návrhu relační databáze.

Lepším řešením je vytvořit jakousi „supertable“, na kterou se odkazují komentáře.

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

Každý z vašich typů obsahu by byl považován za podtyp této supertabulky. Jedná se o analogii objektově orientovaného konceptu rozhraní .

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

Než budete moci vložit řádek do BlogPosts nebo UserPictures , musíte do Commentable vložit nový řádek vygenerovat nové ID pseudoklíče. Poté můžete toto vygenerované ID použít při vkládání obsahu do příslušné tabulky podtypů.

Jakmile to všechno uděláte, můžete se spolehnout na omezení referenční integrity.



  1. Proč iterace přes velký Django QuerySet spotřebovává obrovské množství paměti?

  2. Správa uživatelských účtů, role, oprávnění, autentizace PHP a MySQL -- Část 5

  3. MySQL InnoDB neuvolňuje místo na disku po smazání datových řádků z tabulky

  4. Plánovač událostí MySQL každý den v konkrétní čas