ホームページ >データベース >mysql チュートリアル >循環リレーションシップのために SQLAlchemy で複雑な外部キー制約を実装するにはどうすればよいですか?

循環リレーションシップのために SQLAlchemy で複雑な外部キー制約を実装するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-20 14:42:09429ブラウズ

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

SQLAlchemy の複雑な外部キー制約

データベース モデリングの領域では、外部キー関係が複雑な依存関係を形成する状況に遭遇することがよくあります。このようなシナリオの 1 つは、参照整合性を維持しながら、循環関係における外部キー参照の有効性を確保することです。

問題

2 つのテーブル SystemVariables と VariableOptions について考えてみましょう。 。 SystemVariables には構成可能な変数が含まれており、VariableOptions には各変数の可能なオプションが含まれています。各 SystemVariable には、選択されたオプションを参照する Choice_id があり、各 VariableOption には、関連付けられた変数を示す variable_id があります。

課題は、SystemVariables の Choice_id が有効な (variable_id) オプションを参照することを保証するデータベース制約を実装することにあります。 VariableOptions.

解決策

この課題に対処する 1 つのアプローチは、選択したオプションを参照する外部キーを拡張して、choice_id と variable_id の両方を含めることです。これにより、SystemVariables の Choice_id も、variable_id を暗黙的に検証することが保証されます。

実装

次の SQL スクリプトは、このアプローチを示しています。

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);

This設計により、choice_id の有効性が variable_id 外部キーを通じて検証できるようになります。 relationship.

All Key Columns NOT NULL

不明な関連付けを持つエントリを回避する別の方法は、外部キーを含むすべてのキー列を NOT NULL にすることです。ただし、この従来のアプローチでは、循環依存の問題が発生します。

遅延可能な外部キー制約

循環依存に対処するために、PostgreSQL は、遅延可能な外部キー制約という解決策を提供します。外部キー制約を遅延可能として定義すると、その検証はトランザクションの終了まで延期されます。

これにより、変数やオプションを任意の順序で柔軟に入力できるようになり、循環依存関係に関連する鶏が先か卵が先かの問題が克服されます。

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。