Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL — warunkowe ograniczenia klucza obcego

Próbujesz stworzyć projekt o nazwie Powiązania polimorficzne . Oznacza to, że klucz obcy może odwoływać się do wierszy w dowolnej z kilku powiązanych tabel.

Ale ograniczenie klucza obcego musi odwoływać się dokładnie do jednej tabeli. Nie możesz zadeklarować klucza obcego, który odwołuje się do różnych tabel w zależności od wartości w innej kolumnie Twoich Comments stół. Naruszyłoby to kilka zasad projektowania relacyjnych baz danych.

Lepszym rozwiązaniem jest stworzenie czegoś w rodzaju „supertable”, do którego odwołują się komentarze.

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żdy z twoich typów treści byłby uważany za podtyp tego superstołu. Jest to analogiczne do koncepcji zorientowanej obiektowo interfejsu .

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

Zanim będziesz mógł wstawić wiersz do BlogPosts lub UserPictures , musisz wstawić nowy wiersz do Commentable aby wygenerować nowy identyfikator pseudoklucza. Następnie możesz użyć tego wygenerowanego identyfikatora podczas wstawiania treści do odpowiedniej tabeli podtypów.

Gdy już to zrobisz, możesz polegać na ograniczeniach integralności referencyjnej.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MariaDB – MySQL – Pokaż silniki, aby wyświetlić wszystkie dostępne i obsługiwane silniki

  2. Jak utworzyć histogram w MySQL?

  3. Jak uzyskać miesiąc z daty w MySQL?

  4. Test połączenia PDO

  5. Wspólne wyrażenia tabelowe MySQL 8 CTE