Maison > base de données > tutoriel mysql > Comment gérer plusieurs références de clé étrangère à une seule colonne dans la conception d'une base de données ?

Comment gérer plusieurs références de clé étrangère à une seule colonne dans la conception d'une base de données ?

Patricia Arquette
Libérer: 2025-01-01 03:19:11
original
871 Les gens l'ont consulté

How Can Multiple Foreign Key References to a Single Column Be Handled in Database Design?

Références de clés étrangères multiples à une seule colonne

Dans la conception de bases de données, il peut être avantageux de référencer une seule colonne dans une table comme étrangère clés dans plusieurs autres tables. Cette approche permet une association transparente des données et une récupération cohérente des données sur plusieurs entités.

Énoncé du problème

Considérez le scénario de base de données suivant :

Vous avez une table appelé pdf_created avec les colonnes item_type, item_id et quantité. Chaque ligne de ce tableau représente un élément extrait d'un document PDF. La colonne item_type identifie le type d'article (par exemple, "1" pour le produit, "2" pour l'en-tête du modèle). La colonne item_id fait référence à la clé primaire de la table d'éléments correspondante (par exemple, produit, service, en-tête). L'objectif est de référencer la colonne item_id en tant que clé étrangère dans les trois tables d'éléments : produit, service et en-tête.

Cependant, le code SQL suivant ne parvient pas à créer les relations souhaitées :

CREATE TABLE `pdf_created` (
    `id` INT(10) UNSIGNED NOT NULL UNIQUE AUTO_INCREMENT,
    `pdf_id` INT(10) NOT NULL,
    `item_type` INT(3) UNSIGNED NOT NULL,
    `item_id` INT(10) UNSIGNED NOT NULL,
    `quantity` INT(3) NOT NULL,
    PRIMARY KEY (`id`),
    KEY `FK_pdf_id` (`pdf_id`),
    CONSTRAINT `FK_pdf_id` FOREIGN KEY (`pdf_id`) REFERENCES `pdf` (`id`),
    KEY `FK_item_type` (`item_type`),
    CONSTRAINT `FK_item_type` FOREIGN KEY (`item_type`) REFERENCES `item` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
    KEY `FK_item_id` (`item_id`),
    CONSTRAINT `FK_item_id` FOREIGN KEY (`item_id`) REFERENCES `product` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT `FK_item_id` FOREIGN KEY (`item_id`) REFERENCES `service` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT `FK_item_id` FOREIGN KEY (`item_id`) REFERENCES `header` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Copier après la connexion

Raison de l'échec

Le problème réside dans les multiples contraintes de clé étrangère sur la colonne item_id. Une contrainte de clé étrangère garantit que chaque valeur de la colonne item_id est présente en tant que valeur de clé primaire dans au moins l'une des quatre tables (produit, service, en-tête). Cependant, il est impossible de garantir que item_id existera toujours en tant que clé primaire dans les quatre tables simultanément.

Solution

Bien qu'il ne soit pas possible de créer plusieurs clés étrangères contraintes clés sur une seule colonne faisant référence à différentes tables, vous pouvez toujours utiliser la colonne item_id pour référencer les trois tables d'éléments. Supprimez toutes les contraintes de clé étrangère sur la colonne item_id et comptez sur le code de l'application pour appliquer l'intégrité référentielle :

CREATE TABLE `pdf_created` (
    `id` INT(10) UNSIGNED NOT NULL UNIQUE AUTO_INCREMENT,
    `pdf_id` INT(10) NOT NULL,
    `item_type` INT(3) UNSIGNED NOT NULL,
    `item_id` INT(10) UNSIGNED NOT NULL,
    `quantity` INT(3) NOT NULL,
    PRIMARY KEY (`id`),
    KEY `FK_pdf_id` (`pdf_id`),
    CONSTRAINT `FK_pdf_id` FOREIGN KEY (`pdf_id`) REFERENCES `pdf` (`id`),
    KEY `FK_item_type` (`item_type`),
    CONSTRAINT `FK_item_type` FOREIGN KEY (`item_type`) REFERENCES `item` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Copier après la connexion

Cela vous permet de maintenir les relations de données nécessaires sans introduire d'erreurs d'intégrité 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!

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