문제

나는 최근에 내 DB 전체를 MyISAM에서 InnoDB로 마이그레이션했습니다. 나는이 모든 것에 상당히 새로운 것이므로 외국 키 사용에 관한 질문이 있습니다.

사용자, 메시지라는 두 개의 테이블이 있다고 가정 해 봅시다.

사용자

id (pr_key)
name

메시지

id (pr_key)
user_id
message

ID 필드는 모두 자동 증분됩니다.

이제 쿼리 에서이 두 테이블에 이미 참여합니다. 여기에 외국 열쇠를 놓아야 할 필요가 있습니까? 실제로는 요점이 보이지 않습니다. 성능 이점이 있습니까?

여기에 외국 키를 넣으려면 id와 user_id 모두의 pr_key를 만들어야한다고 가정합니다.

다른 Prim_key는 더 많은 공간을 차지할뿐만 아니라 성능이 느려질 것입니다.

이제 테이블에 두 개의 pr_keys가 있고 그 중 하나에만 쿼리하는 경우 여전히 동일한 성능 이점이 있습니다. 아니면 두 키를 명시 적으로 사용해야합니까?

이 예에서 나는 user_id에서 검색 할 것이므로 어쨌든 이것을 색인화하는 것이 현명 할 수 있습니다. 그러나 필드가 검색이없는 필드라면 어떨까요? 외국 헤이 관계를 위해이 필드에 여러 기본 키를 배치하는 것이 여전히 좋습니까?

고맙습니다!

도움이 되었습니까?

해결책

가지고 있습니다 데이터 무결성 혜택.

사용자 테이블에 ID = 1234가있는 사용자가없는 경우 메시지 테이블에서 1234의 user_id를 입력하는 것이 중지됩니다. 사용자가 메시지 테이블에 메시지가있을 때 응용 프로그램이 사용자를 삭제하는 것을 중지합니다.

PK의 이름은 참조 아동 테이블에서 FK의 이름과 일치하지 않아도됩니다.

"외국 키를 여기에 넣으려면 id와 user_id 모두의 pr_key를 만들어야한다고 가정합니다."

아니. 메시지 테이블에서 키를 변경하지 않으며 메시지 테이블의 user_id 열에서 외부 키 (FK) 제약 조건을 설정합니다. 메시지에는 추가 PK가 필요하지 않으며 PK는 이미 고유하기 때문에 (동일한 MessageID를 가진 두 개의 메시지를 가질 수 없음) ID와 user_id 모두에서 PK를 더 이상 추가 할 수 없습니다.)

결론적으로 여기서는 주요 키와 외국 키가 실제로 무엇인지에 대한 근본적인 오해가있을 수 있다는 것입니다.

  • PK는 행의 독창성에 대한 제약으로 인덱스가 필요합니다.
  • FK는 열의 값에 대한 제약 조건입니다 (다른 참조 테이블에서 값이 PK 값으로 존재해야 함) ~ 아니다 색인이 필요합니다.

@Noah, 이것을 확인하십시오 다른 질문

다른 팁

메시지 (user_id)에 대한 공식적인 외국 키 규칙을 설정하든 아니든 간단한 사실은 이것이 외국의 주요 관계라는 것입니다.

먼저 테이블의 적절한 기본 키는 테이블의 각 레코드를 고유하게 식별하기에 충분해야합니다. 각 메시지가 이미 id 필드, 당신은 필요하지 않으며 특히 포장하고 싶지 않습니다. user_id 메시지 테이블의 기본 키로

둘째, Charles는 이미 사용자 (ID)를 참조하는 메시지 (user_id)에 대한 외국 키를 선언하면 데이터의 무결성을 보장 할 수 있습니다. 외국 키 제약 조건을 사용하면 메시지 테이블에 해당 레코드가있는 사용자 테이블의 레코드가 삭제 될 때 수행 할 작업을 지정할 수 있습니다. 선택 사항은 Cascade 삭제 (이 사용자 레코드의 모든 하위 레코드 삭제), 삭제 제한 (메시지 테이블에 레코드가있는 사용자가 삭제되지 않도록 허용하지 않음)에서 선택하지 않습니다 (삭제되지 않음) , on set null을 삭제합니다 (자식 기록을 보존하지만 user_id 필드를 null로 설정합니다).

이러한 각 옵션은 상황에 따라 적절하지만 여기서 가장 중요한 것은 자식 테이블에서 부모 테이블로 예기치 않은 널 포인터를 방지 할 수 있다는 것입니다.

셋째, 외국 키 관계를 설정하면 사용자 테이블의 기본 키에 해당하는 메시지 (user_id)에 대한 색인이 생성되므로 성능 향상이 제공됩니다. 이 필드에서 조인하는 쿼리를 수행 할 때, 아동 레코드를 반환하기 위해 쿼리 해야하는 레코드의 수는 외국 키를 설정하지 않은 것과 비교할 때 실질적으로 줄어든다는 것을 알 수 있습니다.

@Charles Bretana- 링크 된 질문은 Microsoft SQL Server에만 해당됩니다. 여기서 문제는 MySQL / innodb에 관한 것입니다.

문서를 보는 것이 좋습니다. InnoDB 외국 주요 제약 조건.

InnoDB는 외래 키 검사가 빠르고 테이블 스캔이 필요하지 않도록 외래 키와 참조 키에 대한 색인이 필요합니다. 참조 테이블에는 외국 키 열이 동일한 순서의 첫 번째 열로 나열되는 색인이 있어야합니다. 이러한 색인은 참조 테이블이 존재하지 않으면 자동으로 작성됩니다. (이것은 인덱스가 명시 적으로 생성되어야했거나 외국의 주요 제약 조건의 생성이 실패 할 수있는 일부 이전 버전과 대조적입니다.) 주어진 경우, 주어진 경우, 이전에 설명 된대로 사용됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top