web-dev-qa-db-fra.com

Clé composite en tant que clé étrangère (sql)

voici mes deux tableaux de préoccupation:

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`)
) 

Je voudrais créer un champ dans "groupe" qui serait lié aux clés uniques composites dans "tutoriel". Donc je suppose que ma question est, comment puis-je relier ces tableaux? dois-je créer un champ de clés étrangères dans 'groupe' pour chaque clé primaire dans 'tutoriel'?

21
dgamma3

Selon la documentation mySQL vous devriez être en mesure de configurer un mappage de clé étrangère vers les composites, ce qui vous obligera à créer les multiples colonnes.

Ajoutez les colonnes et placez-les dans votre table group

FOREIGN KEY (`beggingTime`,`day`,`tutorId`) 
    REFERENCES tutorial(`beggingTime`,`day`,`tutorId`)

Comme Steven l'a fait allusion dans les commentaires ci-dessous, vous DEVEZ essayer de ré-architecturer cela afin que la table du didacticiel utilise une clé primaire réelle (même s'il ne s'agit que d'une clé de substitution d'identité). Cela permettra de meilleures performances car SQL a été conçu pour ce type de relation, pas composite.

25
Justin Pihony

1] réécrit la première table: en mettant tutorId en premier, c'est automatiquement une clé à part entière. En fait, toutes les colonnes composites sauf la dernière deviennent une clé.

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 mykey (`tutorId`,`beggingTime`,`day`)
) 

2] Avoir autant d'index est très coûteux pour les tables d'écriture lourdes. Considérez donc un champ supplémentaire dans le didacticiel à utiliser comme clé étrangère; peut-être un auto_increment record_id. Donnez-lui quelques réflexions.

1
kasavbere