Références circulaires en SQL : un dilemme
Dans le domaine de la conception de bases de données relationnelles, une question se pose : est-il acceptable que deux tables se référencent-ils ? Malheureusement, la réponse dépend du système de gestion de base de données (SGBD) spécifique utilisé et de la fonctionnalité souhaitée.
Le problème
Comme l'illustre l'exemple de structure de base de données donné. , deux tables, products et products_pictures, ont des contraintes de clé étrangère qui créent une référence circulaire :
products.DEFAULT_PICTURE_ID -> products_pictures.ID products_pictures.PRODUCT_ID -> products.ID
Cette circularité peut conduire à des problèmes, notamment dans MySQL.
Solutions possibles
Option 1 : Nullabilité de clé étrangère réglable
Une solution consiste à créer l'une des clés étrangères colonnes clés nullables. Cela permet des INSERTs initiaux dans les deux tables sans violer la contrainte d'intégrité. Cependant, cela peut introduire des problèmes d'intégrité des données, par exemple en permettant aux produits d'avoir des images par défaut appartenant à d'autres produits. Pour résoudre ce problème, la contrainte de clé étrangère peut être définie comme suit :
CONSTRAINT FK_products_1 FOREIGN KEY (id, default_picture_id) REFERENCES products_pictures (product_id, id) ON DELETE RESTRICT ON UPDATE RESTRICT
Option 2 : IsDefault Flag
Une autre approche consiste à remplacer la colonne DEFAULT_PICTURE_ID dans la table products avec un indicateur IsDefault dans la table products_pictures. Cette solution nécessite de définir une contrainte ou un index unique pour garantir qu'une seule image par produit a l'indicateur IsDefault défini sur true. Cependant, MySQL ne prend pas en charge les index partiels, ce qui rend cette approche peu pratique.
Option 3 : Contraintes reportables
Cette option implique l'utilisation de contraintes reportables. Les contraintes reportables permettent à la base de données de retarder temporairement l'application de la contrainte d'intégrité, permettant ainsi la configuration initiale des tables et de leurs relations. Cependant, MySQL ne prend pas en charge les contraintes reportables.
Option 4 : Table intermédiaire
Pour éliminer complètement les références circulaires, une troisième table peut être introduite :
product_default_picture ---------------------- product_id NOT NULL default_picture_id NOT NULL PRIMARY KEY (product_id) FOREIGN KEY (product_id, default_picture_id) REFERENCES products_pictures (product_id, id)
Cette approche élimine la circularité et garantit l'intégrité des données.
MySQL Recommandations
Pour MySQL, deux options restent viables :
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!