Heim >Datenbank >MySQL-Tutorial >Wie implementiert man bedingte Fremdschlüsseleinschränkungen in MySQL für polymorphe Assoziationen?

Wie implementiert man bedingte Fremdschlüsseleinschränkungen in MySQL für polymorphe Assoziationen?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-16 11:22:59552Durchsuche

How to Implement Conditional Foreign Key Constraints in MySQL for Polymorphic Associations?

Bedingte Fremdschlüsseleinschränkungen in MySQL: Lösung polymorpher Assoziationsprobleme

Fremdschlüsseleinschränkungen erzwingen die Datenintegrität, indem sie sicherstellen, dass Werte in einer Tabelle auf entsprechende Werte in einer anderen zugehörigen Tabelle verweisen. In einigen Fällen erfordert eine Tabelle jedoch möglicherweise einen Fremdschlüssel, der auf der Grundlage von Bedingungen auf eine andere Tabelle verweist. Dies wird als Bedingte Fremdschlüsseleinschränkung bezeichnet.

In diesem Fall besteht die Herausforderung darin, eine Comments Tabelle zu erstellen, in der Kommentare für verschiedene Teile der Anwendung gespeichert werden können. Zum Beispiel Kommentare zu Blogbeiträgen und Benutzerbildern. Im Idealfall sollten Fremdschlüsseleinschränkungen für Comments in der foreign_id-Tabelle nur angewendet werden, wenn model auf „Blogpost“ gesetzt ist.

Lösung: Polymorphe Assoziation

Leider unterstützt MySQL bedingte Fremdschlüsseleinschränkungen nicht direkt. Stattdessen besteht die Lösung darin, ein Entwurfsmuster namens Polymorphic Association zu verwenden. Dieses Schema führt eine Zwischentabelle mit dem Namen Commentable ein.

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

Jeder Inhaltstyp (z. B. BlogPost, UserPicture) wird zu einem Untertyp von Commentable und verweist über einen Fremdschlüssel darauf.

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

Bevor Daten zu diesen Subtyptabellen hinzugefügt werden, müssen neue Zeilen in die Commentable-Tabelle eingefügt werden, um eindeutige IDs zu generieren. Diese generierte ID wird dann als Fremdschlüssel in der Subtyptabelle verwendet.

Durch die Verwendung dieses Entwurfsmusters können Sie Einschränkungen der referenziellen Integrität erzwingen und so sicherstellen, dass Kommentare zu Blogbeiträgen nur auf Blogbeiträge verweisen und Kommentare zu Benutzerbildern nur auf Benutzerbilder verweisen.

Das obige ist der detaillierte Inhalt vonWie implementiert man bedingte Fremdschlüsseleinschränkungen in MySQL für polymorphe Assoziationen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn