Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

MySQL - Batasan Kunci Asing Bersyarat

Anda mencoba membuat desain yang disebut Asosiasi Polimorfik . Artinya, kunci asing dapat mereferensikan baris di salah satu dari beberapa tabel terkait.

Tetapi batasan kunci asing harus merujuk tepat satu tabel. Anda tidak dapat mendeklarasikan kunci asing yang mereferensikan tabel yang berbeda bergantung pada nilai di kolom lain Comments Anda meja. Ini akan melanggar beberapa aturan desain database relasional.

Solusi yang lebih baik adalah membuat semacam "supertable" yang dirujuk oleh komentar.

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

Setiap tipe konten Anda akan dianggap sebagai subtipe dari supertabel ini. Ini analog dengan konsep berorientasi objek dari antarmuka .

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

Sebelum Anda dapat menyisipkan baris ke BlogPosts atau UserPictures , Anda harus memasukkan baris baru ke Commentable untuk menghasilkan id pseudokey baru. Kemudian Anda dapat menggunakan id yang dihasilkan saat Anda memasukkan konten ke tabel subtipe masing-masing.

Setelah Anda melakukan semua itu, Anda dapat mengandalkan batasan integritas referensial.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menggunakan MySQL dengan Entity Framework

  2. JSON_MERGE_PATCH() vs JSON_MERGE_PRESERVE() di MySQL:Apa Bedanya?

  3. Fungsi Konversi MySQL

  4. Cara membuat dan memelihara Database MySQL di cPanel

  5. LOAD DATA LOCAL INFILE memberikan kesalahan Perintah yang digunakan tidak diizinkan dengan versi MySQL ini