データベース設計では、データの一貫性を確保するために外部キー制約を強制することが必要になることがよくあります。ただし、ポリモーフィズムを伴うシナリオでは、外部キーが複数の関連テーブルの行を参照する可能性があり、従来の外部キー制約では不十分です。
ここで示した例では、comments テーブルには、モデル フィールドに基づいてさまざまなテーブル (ブログ投稿、画像など) を参照できる foreign_id フィールドが含まれています。これを行うには、条件付き外部キー制約が必要です。
MySQL 自体は、条件付き外部キー制約をサポートしていません。条件に基づいて別のテーブルを参照する外部キーを宣言すると、リレーショナル データベースの設計原則に違反します。
「多態性関連付け」と呼ばれる、より効率的なアプローチには、関連するすべてのテーブルの単一の参照ポイントとして機能する「スーパーテーブル」を作成することが含まれます。この場合、次の構造を実装できます:
<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>
各コンテンツ タイプ (ブログ投稿、ユーザー画像など) は、コメント可能なスーパーテーブルのサブタイプになります。
<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>
特定のコンテンツ テーブルにデータを挿入するには、まずコメント可能テーブルに新しい行を挿入して、疑似主キー ID を取得する必要があります。この ID は特定のコンテンツ テーブルに使用できます。
このアプローチにより、多態性の関連付けに必要な柔軟性を維持しながら、参照整合性が可能になります。
以上がMySQL でポリモーフィックな関連付けを実装して条件付き外部キーを処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。