ホームページ >データベース >mysql チュートリアル >MySQL でポリモーフィックな関連付けのための条件付き外部キー制約を実装するにはどうすればよいですか?
MySQL の条件付き外部キー制約: 多態性関連の問題の解決
外部キー制約は、あるテーブルの値が別の関連テーブルの対応する値を参照することを保証することで、データの整合性を強制します。ただし、場合によっては、条件に基づいて別のテーブルを参照する外部キーがテーブルに必要になる場合があります。これは条件付き外部キー制約と呼ばれます。
この場合、課題は、アプリケーションのさまざまな部分のコメントを保存できる Comments
テーブルを作成することです。たとえば、ブログ投稿やユーザー画像に対するコメントなどです。理想的には、Comments
テーブル内の foreign_id
に対する外部キー制約は、model
が 'blogpost' に設定されている場合にのみ適用されるべきです。
解決策: ポリモーフィック関連付け
残念ながら、MySQL は条件付き外部キー制約を直接サポートしていません。代わりに、この解決策には ポリモーフィック アソシエーション と呼ばれるデザイン パターンを使用することが含まれます。このスキーマは、Commentable
という名前の中間テーブルを導入します。
<code class="language-sql">CREATE TABLE Commentable ( id SERIAL PRIMARY KEY ); CREATE TABLE Comments ( comment_id SERIAL PRIMARY KEY, foreign_id INT NOT NULL, ... FOREIGN KEY (foreign_id) REFERENCES Commentable(id) );</code>
各コンテンツ タイプ (例: BlogPost
、UserPicture
) は Commentable
のサブタイプとなり、外部キーを介してそれを参照します。
<code class="language-sql">CREATE TABLE BlogPosts ( blogpost_id INT PRIMARY KEY, -- 非自增 ... FOREIGN KEY (blogpost_id) REFERENCES Commentable(id) ); CREATE TABLE UserPictures ( userpicture_id INT PRIMARY KEY, -- 非自增 ... FOREIGN KEY (userpicture_id) REFERENCES Commentable(id) );</code>
これらのサブタイプ テーブルにデータを追加する前に、Commentable
テーブルに新しい行を挿入して一意の ID を生成する必要があります。この生成された ID は、サブタイプ テーブルの外部キーとして使用されます。
このデザイン パターンを使用すると、参照整合性制約を適用して、ブログ投稿のコメントがブログ投稿のみを参照し、ユーザー画像のコメントがユーザー画像のみを参照するようにすることができます。
以上がMySQL でポリモーフィックな関連付けのための条件付き外部キー制約を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。