Perhubungan pangkalan data selalunya melibatkan senario kompleks yang memerlukan kekangan tambahan untuk memastikan integriti data. Artikel ini meneroka cabaran khusus: melaksanakan kekangan kunci asing yang memastikan kesahihan pilihan sambil mempertimbangkan potensi perhubungan bulat.
Pertimbangkan dua jadual: SystemVariables dan VariableOptions. SystemVariables mewakili pembolehubah sistem yang boleh disesuaikan, manakala VariableOptions mengandungi pilihan yang tersedia untuk pembolehubah ini. Setiap SystemVariable mempunyai pilihan pilihan yang diwakili oleh medan choice_id, manakala setiap VariableOption mempunyai variable_id yang menunjukkan pembolehubah miliknya.
Matlamatnya adalah untuk menambah kekangan tambahan yang memastikan:
VariableOptions[sysVar.choice_id].variable_id == sysVar.id
di mana sysVar ialah baris dalam jadual SystemVariables.
Penyelesaian yang mudah ialah memanjangkan kunci asing yang merujuk kepada pilihan yang dipilih untuk memasukkan kedua-dua choice_id dan variable_id:
ALTER TABLE systemvariables ADD CONSTRAINT systemvariables_choice_id_fk FOREIGN KEY (choice_id, variable_id) REFERENCES variableoptions(option_id, variable_id);
Ini memastikan bahawa pilihan yang dipilih adalah sah dan merujuk kembali kepada yang betul berubah-ubah dalam kedua-dua arah.
Sebelumnya pendekatan memerlukan semua lajur utama bukan NULL, yang boleh memperkenalkan sekatan apabila bekerja dengan sisipan baharu. Penyelesaian yang lebih baik ialah memanfaatkan kekangan utama asing yang boleh ditangguhkan.
CREATE TABLE systemvariables ( variable_id int PRIMARY KEY , variable text , choice_id int NOT NULL ); CREATE TABLE variableoptions ( option_id int PRIMARY KEY , option text , variable_id int NOT NULL REFERENCES systemvariables ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED , UNIQUE (option_id, variable_id) -- needed for the foreign key ); ALTER TABLE systemvariables ADD CONSTRAINT systemvariables_choice_id_fk FOREIGN KEY (choice_id, variable_id) REFERENCES variableoptions(option_id, variable_id) DEFERRABLE INITIALLY DEFERRED;
Pendekatan ini membolehkan pemasukan pembolehubah dan pilihan baharu dalam urus niaga yang sama, walaupun apabila ia bergantung antara satu sama lain, dengan menangguhkan semakan kunci asing sehingga penghujung urus niaga.
Dengan menggunakan kekangan kunci asing yang boleh ditangguhkan dan memanjangkan kunci asing untuk memasukkan berbilang lajur, seseorang boleh mencapai kekangan kunci asing yang kompleks yang mengekalkan integriti data sambil membenarkan fleksibiliti dalam manipulasi data.
Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Kekangan Utama Asing yang Kompleks dalam SQLAlchemy untuk Memastikan Integriti Data?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!