Maison >base de données >tutoriel mysql >Comment implémenter des contraintes de clé étrangère conditionnelles dans MySQL pour les associations polymorphes ?
Contraintes de clés étrangères conditionnelles dans MySQL : résolution de problèmes d'association polymorphes
Les contraintes de clé étrangère renforcent l'intégrité des données en garantissant que les valeurs d'une table font référence aux valeurs correspondantes dans une autre table associée. Toutefois, dans certains cas, une table peut nécessiter une clé étrangère faisant référence à une table différente en fonction de conditions. C'est ce qu'on appelle une Contrainte conditionnelle de clé étrangère.
Dans ce cas, le défi est de créer un tableau Comments
pouvant stocker des commentaires pour différentes parties de l'application. Par exemple, les commentaires sur les articles de blog et les images des utilisateurs. Idéalement, les contraintes de clé étrangère sur Comments
dans la table foreign_id
ne devraient être appliquées que lorsque model
est défini sur « blogpost ».
Solution : Association polymorphe
Malheureusement, MySQL ne prend pas directement en charge les contraintes de clés étrangères conditionnelles. Au lieu de cela, la solution consiste à utiliser un modèle de conception appelé Association polymorphe. Ce schéma introduit une table intermédiaire nommée 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>
Chaque type de contenu (par exemple, BlogPost
, UserPicture
) devient un sous-type de Commentable
et le référence via une clé étrangère.
<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>
Avant d'ajouter des données à ces tables de sous-types, de nouvelles lignes doivent être insérées dans la table Commentable
pour générer des identifiants uniques. Cet ID généré est ensuite utilisé comme clé étrangère dans la table des sous-types.
En utilisant ce modèle de conception, vous pouvez appliquer des contraintes d'intégrité référentielle, en garantissant que les commentaires sur les articles de blog font uniquement référence aux articles de blog et que les commentaires sur les images des utilisateurs font uniquement référence aux images des utilisateurs.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!