データベース リレーションシップには、多くの場合、データの整合性を確保するために追加の制約を必要とする複雑なシナリオが含まれます。この記事では、潜在的な循環関係を考慮しながら選択の有効性を保証する外部キー制約の実装という具体的な課題について説明します。
SystemVariables と VariableOptions の 2 つのテーブルについて考えてみましょう。 SystemVariables はカスタマイズ可能なシステム変数を表し、VariableOptions にはこれらの変数に使用可能な選択肢が含まれています。各 SystemVariable には、choice_id フィールドで表される選択されたオプションがあり、各 VariableOption には、それが属する変数を示す variable_id があります。
目的は、次のことを保証する追加の制約を追加することです。
VariableOptions[sysVar.choice_id].variable_id == sysVar.id
ここで、sysVar は SystemVariables テーブル内の行です。
簡単な解決策は、選択したオプションを参照する外部キーを拡張して、choice_id と variable_id の両方を含めることです。
ALTER TABLE systemvariables ADD CONSTRAINT systemvariables_choice_id_fk FOREIGN KEY (choice_id, variable_id) REFERENCES variableoptions(option_id, variable_id);
これにより、選択したオプションが有効であり、正しいオプションを参照することが保証されます。両方向の変数。
前のアプローチでは、すべてのキー列が NULL 以外である必要があるため、新しい挿入を操作するときに制限が生じる可能性があります。より良い解決策は、遅延可能な外部キー制約を利用することです。
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;
このアプローチでは、外部キーのチェックを次の時点まで延期することで、相互に依存している場合でも、同じトランザクション内に新しい変数とオプションを挿入できます。トランザクションの終了。
遅延可能な外部キー制約を利用し、外部キーを拡張して複数を含めることによって列を使用すると、データ操作の柔軟性を確保しながらデータの整合性を維持する複雑な外部キー制約を実現できます。
以上がSQLAlchemy で複雑な外部キー制約を実装してデータの整合性を確保するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。