Подтвердить что ты не робот

Компонентный ключ как внешний ключ (sql)

вот мои две таблицы, вызывающие озабоченность:

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

Я хотел бы создать поле в "группе", которое будет ссылаться на составные уникальные ключи в "учебнике". Поэтому, я думаю, мой вопрос: как мне связать эти таблицы? мне нужно создать поле внешних ключей в "группе" для каждого первичного ключа в "учебнике"?

4b9b3361

Ответ 1

В документации mySQL вы должны иметь возможность настроить сопоставление внешних ключей для композитов, для чего вам потребуется создать несколько столбцов.

Добавьте столбцы и поместите их в таблицу group

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

Как упоминал Стивен в приведенных ниже комментариях, вам следует попытаться перепроектировать это, чтобы таблица учебников использовала фактический первичный ключ (даже если это всего лишь ключ суррогатной идентификации). Это позволит повысить производительность, поскольку SQL был создан для этого типа отношений, а не составных.

Ответ 2

1] перепишите первую таблицу: сначала положив tutorId, она автоматически станет ключом. Фактически, все, кроме последнего из составных столбцов, становятся ключом.

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] Наличие большого количества индексов очень дорого для тяжелых таблиц записи. Поэтому рассмотрим дополнительное поле в учебнике для использования в качестве внешнего ключа; возможно, auto_increment record_id. Дайте ему некоторые мысли.