Maison >base de données >tutoriel mysql >Comment puis-je implémenter des associations polymorphes dans MySQL pour gérer les clés étrangères conditionnelles ?
Dans la conception de bases de données, il est souvent nécessaire d'appliquer des contraintes de clés étrangères pour garantir la cohérence des données. Cependant, dans les scénarios impliquant le polymorphisme, les clés étrangères peuvent référencer des lignes dans plusieurs tables liées, et les contraintes de clé étrangère traditionnelles sont insuffisantes.
Dans l'exemple fourni, la table des commentaires contient un champ Foreign_id, qui peut référencer différentes tables (articles de blog, image, etc.) en fonction du champ modèle. Pour ce faire, une contrainte de clé étrangère conditionnelle est requise.
MySQL lui-même ne prend pas en charge les contraintes de clé étrangère conditionnelle. Déclarer une clé étrangère faisant référence à une table différente en fonction d'une condition violerait les principes de conception de bases de données relationnelles.
Une approche plus efficace, appelée « association polymorphe », consiste à créer une « supertable » qui sert de point de référence unique pour toutes les tables associées. Dans ce cas, la structure suivante peut être mise en œuvre :
<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 (article de blog, image d'utilisateur, etc.) devient un sous-type de la supertable Commentable :
<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>
L'insertion de données dans une table de contenu spécifique nécessite d'abord d'insérer une nouvelle ligne dans la table Commentable pour obtenir l'identifiant de la pseudo clé primaire. Cet identifiant peut ensuite être utilisé pour une table de contenu spécifique.
Cette approche permet l'intégrité référentielle tout en conservant la flexibilité requise pour les associations polymorphes.
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!