Rujukan Pekeliling dalam SQL: Dilema
Dalam bidang reka bentuk pangkalan data hubungan, timbul persoalan: adakah boleh diterima dua jadual untuk merujuk antara satu sama lain? Jawapannya, malangnya, bergantung pada sistem pengurusan pangkalan data (DBMS) khusus yang digunakan dan fungsi yang diingini.
Masalahnya
Seperti yang ditunjukkan dalam contoh struktur pangkalan data yang diberikan , dua jadual, produk dan gambar_produk, mempunyai kekangan utama asing yang mencipta pekeliling rujukan:
products.DEFAULT_PICTURE_ID -> products_pictures.ID products_pictures.PRODUCT_ID -> products.ID
Pekeliling ini boleh membawa kepada isu, terutamanya dalam MySQL.
Penyelesaian Kemungkinan
Pilihan 1: Asing Boleh Laras Keterasingan Utama
Satu penyelesaian ialah membuat salah satu lajur kunci asing boleh batal. Ini membenarkan INSERT awal ke dalam kedua-dua jadual tanpa melanggar kekangan integriti. Walau bagaimanapun, ia mungkin memperkenalkan kebimbangan integriti data, seperti membenarkan produk mempunyai gambar lalai yang dimiliki oleh produk lain. Untuk menangani isu ini, kekangan kunci asing boleh ditakrifkan seperti berikut:
CONSTRAINT FK_products_1 FOREIGN KEY (id, default_picture_id) REFERENCES products_pictures (product_id, id) ON DELETE RESTRICT ON UPDATE RESTRICT
Pilihan 2: IsDefault Flag
Pendekatan lain ialah menggantikan lajur DEFAULT_PICTURE_ID dalam jadual produk dengan bendera IsDefault dalam jadual products_pictures. Penyelesaian ini memerlukan penentuan kekangan atau indeks unik untuk memastikan bahawa hanya satu gambar bagi setiap produk mempunyai bendera IsDefault ditetapkan kepada benar. Walau bagaimanapun, MySQL tidak menyokong indeks separa, yang menjadikan pendekatan ini tidak praktikal.
Pilihan 3: Kekangan Boleh Ditunda
Pilihan ini melibatkan penggunaan kekangan yang boleh ditangguhkan. Kekangan yang boleh ditangguhkan membenarkan pangkalan data untuk menangguhkan sementara penguatkuasaan kekangan integriti, membolehkan untuk persediaan awal jadual dan perhubungannya. Walau bagaimanapun, MySQL tidak menyokong kekangan yang boleh ditangguhkan.
Pilihan 4: Jadual Pertengahan
Untuk menghapuskan rujukan bulat sepenuhnya, jadual ketiga boleh diperkenalkan:
product_default_picture ---------------------- product_id NOT NULL default_picture_id NOT NULL PRIMARY KEY (product_id) FOREIGN KEY (product_id, default_picture_id) REFERENCES products_pictures (product_id, id)
Pendekatan ini menghapuskan pekeliling dan memastikan data integriti.
Syor MySQL
Untuk MySQL, dua pilihan kekal berdaya maju:
Atas ialah kandungan terperinci Bagaimanakah Rujukan Pekeliling dalam SQL Dapat Diselesaikan, Terutamanya dalam MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!