Aufrechterhaltung der referenziellen Integrität in MySQL mit polymorphen Assoziationen
Die Fremdschlüsseleinschränkungen von MySQL sind für die Integrität relationaler Datenbanken von entscheidender Bedeutung. Die Verwaltung der referenziellen Integrität mit polymorphen Assoziationen – bei denen ein einzelner Fremdschlüssel auf mehrere Tabellen verweist – stellt jedoch besondere Herausforderungen dar.
Polymorphe Beziehungen und Datenintegrität
Stellen Sie sich eine Comments
-Tabelle vor, die Kommentare zu verschiedenen Anwendungsteilen (z. B. Blogbeiträgen, Bildern) enthält, die durch die Spalte model
identifiziert werden. Direktes Durchsetzen einer Fremdschlüsseleinschränkung wie dieser:
<code class="language-sql">FOREIGN KEY (`foreign_id`) REFERENCES blogposts(`id`)</code>
ist unzureichend, da es nur gegen blogposts
validiert und den Wert der model
-Spalte ignoriert. MySQL verfügt nicht über native Unterstützung für bedingte Fremdschlüsseleinschränkungen basierend auf Spaltenwerten.
Strategien für den Umgang mit polymorphen Assoziationen
Um die Datenintegrität in polymorphen Beziehungen aufrechtzuerhalten, ziehen Sie diese Alternativen in Betracht:
1. Der Supertable-Ansatz:
Erstellen Sie eine Commentable
Supertabelle, von der alle Inhaltstypen erben. Jede Inhaltstyptabelle verweist dann über einen Fremdschlüssel auf 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) ); 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>
2. Zusammengesetzte Primärschlüsselstrategie:
Verwenden Sie einen zusammengesetzten Primärschlüssel, der sowohl foreign_id
als auch model
umfasst:
<code class="language-sql">CREATE TABLE Comments ( id INT, foreign_id INT, model TEXT, PRIMARY KEY (id, model) );</code>
Dies stellt die Eindeutigkeit jeder foreign_id
- und model
-Kombination sicher, erhöht jedoch die Komplexität der Abfrage. Eine sorgfältige Prüfung des Abfragedesigns ist erforderlich.
Das obige ist der detaillierte Inhalt vonWie kann ich referenzielle Integrität mit polymorphen Assoziationen in MySQL erzwingen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!