Maison > base de données > tutoriel mysql > le corps du texte

Comment les références circulaires dans SQL peuvent-elles être résolues, en particulier dans MySQL ?

Patricia Arquette
Libérer: 2024-11-25 02:19:13
original
350 Les gens l'ont consulté

How Can Circular References in SQL be Resolved, Especially in MySQL?

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
Copier après la connexion

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
Copier après la connexion

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)
Copier après la connexion

Cette approche élimine la circularité et garantit l'intégrité des données.

MySQL Recommandations

Pour MySQL, deux options restent viables :

  • Option 1 : nullabilité de clé étrangère réglable avec la correction évoquée ci-dessus pour renforcer l'intégrité des données.
  • Option 4 : Tableau intermédiaire pour éviter complètement les références circulaires.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal