"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > 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 ?

Publié le 2024-12-21
Parcourir:842

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

Gestion 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é étrangère à plusieurs tables

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

  • Création de tables séparées : Établissez 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 via des 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 n'est pas 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.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3