Contrainte de clé étrangère complexe dans SQLAlchemy
Dans le domaine de la modélisation de bases de données, il est courant de rencontrer des situations où les relations de clé étrangère forment des dépendances complexes. Un de ces scénarios consiste à garantir la validité d'une référence de clé étrangère dans une relation circulaire, tout en maintenant l'intégrité référentielle.
Le problème
Considérons deux tableaux : SystemVariables et VariableOptions. . SystemVariables contient des variables configurables, tandis que VariableOptions héberge les options possibles pour chaque variable. Chaque SystemVariable a un Choice_id référençant une option choisie, et chaque VariableOption a un variable_id indiquant sa variable associée.
Le défi réside dans la mise en œuvre d'une contrainte de base de données qui garantit que le Choice_id dans SystemVariables fait référence à une option valide (variable_id) dans VariableOptions.
La solution
Une approche pour Relever ce défi consiste à étendre la clé étrangère faisant référence à l'option choisie pour inclure à la fois Choice_id et variable_id. Cela garantit que le Choice_id dans SystemVariables vérifie également implicitement le variable_id.
Implémentation
Le script SQL suivant illustre cette approche :
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);
Ce la conception garantit que la validité de Choice_id peut être vérifiée via la clé étrangère variable_id relation.
Toutes les colonnes clés NON NULL
Une approche alternative pour éviter les entrées avec des associations inconnues consiste à rendre toutes les colonnes clés, y compris les clés étrangères, NON NULLes. Cependant, cette approche conventionnelle introduit un problème de dépendance circulaire.
Contraintes de clé étrangère différées
Pour résoudre la dépendance circulaire, PostgreSQL propose une solution : les contraintes de clé étrangère différées. En définissant les contraintes de clé étrangère comme différées, leur validation est différée jusqu'à la fin d'une transaction.
Cela permet une saisie flexible de variables et d'options dans des séquences arbitraires, surmontant ainsi le problème de l'œuf de poule associé aux dépendances circulaires.
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;
Dans cette conception, la contrainte de clé étrangère est différée, permettant une saisie flexible des données au sein d'une seule transaction tout en conservant l'intégrité référentielle.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!