Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL - Условни ограничения на външния ключ

Опитвате се да направите дизайн, който се нарича Полиморфни асоциации . Тоест външният ключ може да препраща към редове в която и да е от няколко свързани таблици.

Но ограничението за външен ключ трябва да се отнася точно до една таблица. Не можете да декларирате външен ключ, който препраща към различни таблици в зависимост от стойността в друга колона на вашите Comments маса. Това би нарушило няколко правила за проектиране на релационна база данни.

По-добро решение е да се направи нещо като "супертаблица", която се препраща от коментарите.

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

Всеки от вашите типове съдържание ще се счита за подтип на тази супертаблица. Това е аналогично на обектно-ориентираната концепция наинтерфейса .

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

Преди да можете да вмъкнете ред в BlogPosts или UserPictures , трябва да вмъкнете нов ред в Commentable за генериране на нов идентификатор на псевдоключ. След това можете да използвате този генериран идентификатор, докато вмъквате съдържанието в съответната таблица на подтипове.

След като направите всичко това, можете да разчитате на ограниченията на референтната цялост.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL съхранена процедура срещу функция, коя бих използвал кога?

  2. Реализация на разстоянието на Левещайн за mysql/размито търсене?

  3. Как да конвертирате дата и час в UTC в MySQL

  4. Как да получите последния запис във всяка група в MySQL

  5. PostgreSQL срещу MySQL:Кое е най-доброто?