Clé étrangère composite en SQL
La conception de bases de données implique souvent la création de relations entre les tables. Lorsque la clé primaire d’une table est composée de plusieurs colonnes, il devient difficile de la lier à une clé étrangère d’une autre table. Cette question explore comment établir une relation entre deux tables avec une clé primaire composite et une clé étrangère.
Énoncé du problème
Considérez les deux tables suivantes :
CREATE TABLE IF NOT EXISTS `tutorial` ( `beggingTime` time NOT NULL, `day` varchar(8) NOT NULL, `tutorId` int(3) NOT NULL, `maxMembers` int(2) NOT NULL, `minMembers` int(1) NOT NULL, PRIMARY KEY (`beggingTime`,`day`,`tutorId`), KEY `tutorId` (`tutorId`) ); CREATE TABLE IF NOT EXISTS `group` ( `groupId` tinyint(3) NOT NULL AUTO_INCREMENT, `status` varchar(20) NOT NULL, `groupName` varchar(50) NOT NULL, PRIMARY KEY (`groupId`) );
L'objectif est de créer un champ dans la table de groupe qui renvoie à la clé primaire composite dans la table du tutoriel. La question se pose : comment relier efficacement ces tables ?
Solution
Selon la documentation MySQL, il est possible de mettre en place un mappage de clé étrangère vers des clés composites. Cela nécessite de créer plusieurs colonnes dans la table de clé étrangère :
ALTER TABLE `group` ADD COLUMN `beggingTime` time NOT NULL; ALTER TABLE `group` ADD COLUMN `day` varchar(8) NOT NULL; ALTER TABLE `group` ADD COLUMN `tutorId` int(3) NOT NULL; ALTER TABLE `group` ADD FOREIGN KEY (`beggingTime`,`day`,`tutorId`) REFERENCES tutorial(`beggingTime`,`day`,`tutorId`);
Cette approche crée des colonnes supplémentaires dans la table de groupe qui correspondent aux composants de la clé primaire composite dans la table du didacticiel.
Recommandation
Bien que la création d'une clé étrangère composite soit possible, ce n'est pas toujours le meilleur choix de conception. Comme d'autres réponses l'ont suggéré, il est recommandé de reconsidérer la conception de la table et d'utiliser une clé primaire à une seule colonne pour la table du didacticiel. Cela améliorera les performances de la base de données et simplifiera la gestion des relations.
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!