Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Melaksanakan Kekangan Utama Asing Kompleks dalam SQLAlchemy untuk Hubungan Pekeliling?

Bagaimana untuk Melaksanakan Kekangan Utama Asing Kompleks dalam SQLAlchemy untuk Hubungan Pekeliling?

Linda Hamilton
Lepaskan: 2024-12-20 14:42:09
asal
428 orang telah melayarinya

How to Implement Complex Foreign Key Constraints in SQLAlchemy for Circular Relationships?

Kekangan Kunci Asing Kompleks dalam SQLAlchemy

Dalam bidang pemodelan pangkalan data, adalah perkara biasa untuk menghadapi situasi di mana hubungan kunci asing membentuk kebergantungan yang kompleks. Satu senario sedemikian melibatkan memastikan kesahihan rujukan kunci asing dalam hubungan bulat, sambil mengekalkan integriti rujukan.

Masalahnya

Mari kita pertimbangkan dua jadual: SystemVariables dan VariableOptions . SystemVariables mengandungi pembolehubah boleh dikonfigurasikan, manakala VariableOptions menempatkan pilihan yang mungkin untuk setiap pembolehubah. Setiap SystemVariable mempunyai choice_id yang merujuk kepada pilihan yang dipilih, dan setiap VariableOption mempunyai variable_id yang menunjukkan pembolehubah yang berkaitan.

Cabarannya terletak pada melaksanakan kekangan pangkalan data yang menjamin bahawa choice_id dalam SystemVariables merujuk kepada pilihan (variable_id) yang sah dalam VariableOptions.

The Penyelesaian

Satu pendekatan untuk menangani cabaran ini ialah melanjutkan kunci asing yang merujuk kepada pilihan yang dipilih untuk memasukkan kedua-dua choice_id dan variable_id. Ini memastikan bahawa choice_id dalam SystemVariables juga secara tersirat mengesahkan variable_id.

Pelaksanaan

Skrip SQL berikut menunjukkan pendekatan ini:

CREATE TABLE systemvariables (
  variable_id int PRIMARY KEY,
  choice_id   int,
  variable    text
);

CREATE TABLE variableoptions (
  option_id   int PRIMARY KEY,
  variable_id int REFERENCES systemvariables ON UPDATE CASCADE ON DELETE CASCADE,
  option      text,
  UNIQUE (option_id, variable_id)  -- needed for the FK
);

ALTER TABLE systemvariables
  ADD CONSTRAINT systemvariables_choice_id_fk
  FOREIGN KEY (choice_id, variable_id) REFERENCES variableoptions(option_id, variable_id);
Salin selepas log masuk

Ini reka bentuk memastikan bahawa kesahihan choice_id boleh disahkan melalui kunci asing variable_id perhubungan.

Semua Lajur Utama BUKAN NULL

Pendekatan alternatif untuk mengelakkan entri dengan perkaitan yang tidak diketahui adalah dengan menjadikan semua lajur utama, termasuk kunci asing, BUKAN NULL. Walau bagaimanapun, pendekatan konvensional ini memperkenalkan isu pergantungan bulat.

Kekangan Utama Asing Yang Boleh Ditunda

Untuk menangani pergantungan pekeliling, PostgreSQL menawarkan penyelesaian: kekangan kunci asing yang boleh ditunda. Dengan mentakrifkan kekangan kunci asing sebagai boleh ditangguhkan, pengesahannya ditangguhkan sehingga tamat transaksi.

Ini membolehkan kemasukan pembolehubah dan pilihan yang fleksibel dalam urutan sewenang-wenangnya, mengatasi masalah telur ayam yang dikaitkan dengan kebergantungan bulat.

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;
Salin selepas log masuk

Dalam reka bentuk ini, kekangan kunci asing ditangguhkan, membenarkan kemasukan fleksibel data dalam satu transaksi sambil mengekalkan integriti rujukan.

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Kekangan Utama Asing Kompleks dalam SQLAlchemy untuk Hubungan Pekeliling?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan