Maison >base de données >tutoriel mysql >Comment gérer les relations de clés étrangères avec plusieurs tables dans les bases de données SQL ?

Comment gérer les relations de clés étrangères avec plusieurs tables dans les bases de données SQL ?

DDD
DDDoriginal
2024-12-16 20:55:10334parcourir

How to Handle Foreign Key Relationships to Multiple Tables in SQL Databases?

Traitement des clés étrangères de plusieurs tables

Vous disposez de trois tables : régions, pays et États. Les pays et les États peuvent appartenir à des régions, formant une structure hiérarchique. Maintenant, vous souhaitez créer une table "popular_areas" avec les colonnes "region_id" et "popular_place_id" et établir une relation de clé étrangère entre "popular_place_id" et les pays ou états basés sur une colonne "popular_place_type".

Ceci Ce scénario présente un défi car les contraintes de clé étrangère SQL font généralement référence à une seule table cible. Cependant, il existe un concept connu sous le nom d'associations polymorphes dans la conception de bases de données qui tente de résoudre ce problème.

Associations polymorphes : joindre plusieurs tables avec un supertype commun

Les associations polymorphes permettent une clé étrangère pour faire référence à l’une des nombreuses tables cibles possibles. Ceci est réalisé en utilisant une colonne supplémentaire pour spécifier la table cible référencée. Par exemple, dans votre cas, vous auriez besoin d'une colonne "popular_place_type" pour déterminer si "popular_place_id" fait référence à un pays ou à un état.

Cependant, les associations polymorphes ont des limitations dans SQL en raison de contraintes. SQL ne peut pas assurer la cohérence des bases de données avec des associations polymorphes. Au lieu de cela, il s'appuie sur l'application ou le framework implémentant ces associations pour garantir l'intégrité des données.

Solutions alternatives pour les références de clés étrangères à plusieurs tables

Pour maintenir l'intégrité référentielle sans polymorphisme Associations, envisagez ces alternatives :

  • Créer des tables séparées : Établir des tables telles que « popular_states » et « popular_countries », chacun faisant référence respectivement à des États et à des pays. Cela garantit l'intégrité des données grâce aux contraintes SQL, mais peut nécessiter plusieurs requêtes pour récupérer tous les lieux populaires associés à un utilisateur.
  • Création d'une table parent : Créez une table "places" qui agit comme un supertype pour les États et les pays. Les États et les pays auraient des clés étrangères faisant référence à des « lieux », garantissant l'intégrité référentielle.
  • Utilisation de deux colonnes : Au lieu d'une seule colonne faisant référence à des États ou à des pays, utilisez deux colonnes nullables : " state_id" et "country_id". Cependant, vous devez vous assurer qu'une seule de ces colonnes est non NULL et appliquer cette contrainte via la logique de l'application ou des déclencheurs de base de données.

Intégrité relationnelle et violation des formes normales

Il est important de noter que les associations polymorphes violent les principes de normalisation des bases de données. La première forme normale (1NF) interdit de mélanger différentes significations dans une seule colonne, ce qui se produit lors du stockage des identifiants d'État et de pays dans une seule colonne "popular_place_id". Les associations polymorphes violent également la troisième forme normale (3NF) car la signification de la colonne "popular_place_id" dépend de la colonne supplémentaire "popular_place_type".

En résumé, les associations polymorphes offrent une solution potentielle pour les relations de clé étrangère avec plusieurs tables. en SQL. Cependant, ils introduisent des problèmes d’intégrité des données et violent les principes de normalisation des bases de données. Envisagez les approches alternatives mentionnées ci-dessus pour une gestion robuste des données.

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!

Déclaration:
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