2013-08-08 2 views
0

이 테이블 정의가 있습니다.Mysql 테이블 복합 키

CREATE TABLE `friendship` (
    `fID` bigint(20) NOT NULL AUTO_INCREMENT, 
    `Part1` bigint(20) NOT NULL DEFAULT '0', 
    `Part2` bigint(20) NOT NULL DEFAULT '0', 
    `AddedBy` bigint(11) NOT NULL DEFAULT '0', 
    `Accepted` tinyint(4) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`fID`), 
    KEY `Part1` (`Part1`,`Part2`), 
    KEY `Part1_2` (`Part1`), 
    KEY `Part2` (`Part2`), 
    KEY `AddedBy` (`AddedBy`), 
    KEY `Accepted` (`Accepted`) 
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1; 

왜 "Part1"키가 Part1과 Part2 키를 포함하고 왜 좋을까요/나쁜면을 설명 할 수 있습니까? Part1/Part2에서 FK를 사용하는 것이 더 좋습니까?

MyISAM 및 InnoDB 테이블에서 성능상의 차이점이 있습니까?

답변

1

잘못된 명명 규칙이 있습니다. 나는 키가 익명을 기대 : 어떤 경우에

KEY `Part1_2` (`Part1`,`Part2`), 
KEY `Part1` (`Part1`), 

Part1가 필요하지 않은이 키를. 복합 키 (Part1,Part2)Part1을 사용할 수 있습니다.

1

"Part1"키에 Part1 및 Part2 키가 있고 왜 키가 좋고/좋지 않은지 설명 할 수 있습니까?

내가 알 수있는 한, 그것은 잘못된 이름입니다. 성능 및 데이터 무결성에 관한 한, 여기에있는 이름은 중요하지 않습니다. 나중에 일 수 있습니다. 나중에 이름을 지정해야하는 경우 문제가 될 수 있습니다.

고든 리노프 (Gordon Linoff)와 마찬가지로 질문에 "Part1_2"라는 키를 삭제할 수 있습니다.

Part1/Part2에서 FK를 사용하는 것이 더 좋습니까?

해당 열에 고유 한 제약 조건이 없습니다. MySQL 여전히 당신이 외래 키와 그들을 참조하자,하지만 MySQL의 워드 프로세서는 당신이 그것을하지 말라고. 허용하는 것은 실수였으며 수정하는 것보다 문서화하는 것이 더 쉽습니다.

은 다른 SQL dbms에서의 의미를 의미하지 않습니다. 에서이 CREATE TABLE 문, KEY is a synonym for INDEX; UNIQUE의 동의어가 아니거나 PRIMARY KEY의 약어입니다. 외래 키 제약 조건에 의해 안전하게 참조 될 수있는이 테이블의 유일한 열은 fID입니다.

MyISAM 및 InnoDB 테이블에서 성능상의 차이점이 있습니까?

InnoDB는 행 레벨 잠금, 트랜잭션 및 외래 키 제약 조건을 지원합니다. MyISAM은 그렇지 않습니다. 성능 차이에 대해 생각하기 전에 이러한 차이점에 대해 걱정할 것입니다. 데이터베이스가 잘못된 대답을 제공하는 경우 실행 속도는 중요하지 않습니다.