SQL の循環参照: ジレンマ
リレーショナル データベース設計の領域では、2 つのテーブルがお互いを参考にしますか?残念ながら、その答えは、使用している特定のデータベース管理システム (DBMS) と必要な機能によって異なります。
問題
指定されたデータベース構造の例に示されているように、 2 つのテーブル、products と products_pictures には、循環参照を作成する外部キー制約があります。
products.DEFAULT_PICTURE_ID -> products_pictures.ID products_pictures.PRODUCT_ID -> products.ID
この循環性特に MySQL で問題が発生する可能性があります。
考えられる解決策
オプション 1: 調整可能な外部キーの Nullability
1 つの解決策外部キー列の 1 つを NULL 可能にすることです。これにより、整合性制約に違反することなく、両方のテーブルへの最初の INSERT が可能になります。ただし、製品に他の製品に属するデフォルトの画像が許可されるなど、データの整合性に関する懸念が生じる可能性があります。この問題に対処するには、外部キー制約を次のように定義できます。
CONSTRAINT FK_products_1 FOREIGN KEY (id, default_picture_id) REFERENCES products_pictures (product_id, id) ON DELETE RESTRICT ON UPDATE RESTRICT
オプション 2: IsDefault Flag
もう 1 つの方法は、次の DEFAULT_PICTURE_ID 列を置き換えることです。 products_pictures テーブルに IsDefault フラグが設定された products テーブル。このソリューションでは、一意の制約またはインデックスを定義して、製品ごとに 1 つの画像のみに IsDefault フラグが true に設定されるようにする必要があります。ただし、MySQL は部分インデックスをサポートしていないため、このアプローチは現実的ではありません。
オプション 3: 遅延可能な制約
このオプションには、遅延可能な制約の使用が含まれます。遅延可能な制約を使用すると、データベースによる整合性制約の適用を一時的に遅らせることができ、テーブルとその関係の初期設定が可能になります。ただし、MySQL は遅延可能な制約をサポートしていません。
オプション 4: 中間テーブル
循環参照を完全に排除するために、3 番目のテーブルを導入できます:
product_default_picture ---------------------- product_id NOT NULL default_picture_id NOT NULL PRIMARY KEY (product_id) FOREIGN KEY (product_id, default_picture_id) REFERENCES products_pictures (product_id, id)
このアプローチにより循環性が排除され、データが保証されます
MySQL の推奨事項
MySQL の場合、2 つのオプションが引き続き実行可能です:
以上が特に MySQL で SQL の循環参照を解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。