prosource

합성키를 외래키로(sql)

probook 2023. 10. 5. 23:22
반응형

합성키를 외래키로(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`)
) 

'튜터링'의 복합 고유 키에 링크하는 필드를 '그룹'에 만들고 싶습니다.그래서 제 질문은 이 표들을 어떻게 연관시키느냐는 것입니다.'튜터링'의 각 기본 키에 대해 '그룹'의 외국 키 필드를 작성해야 합니까?

mySQL 설명서에 따라 합성물에 대한 외부 키 매핑을 설정할 수 있어야 하며, 이를 위해서는 여러 개의 열을 만들어야 합니다.

열을 추가하고 이것을 당신의 것에 넣습니다.group테이블

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

아래 의견에서 Steven이 언급한 것처럼 튜토리얼 테이블이 실제 기본 키(ID 대리 키라 하더라도)를 사용하도록 이를 다시 설계해야 합니다.이렇게 하면 SQL이 복합이 아닌 이러한 유형의 관계를 위해 구축되었기 때문에 성능이 향상됩니다.

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.생각 좀 해보세요.

언급URL : https://stackoverflow.com/questions/9780163/composite-key-as-foreign-key-sql

반응형