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!