MySQL/InnoDB 테이블은 항상 클러스터링됩니다 (클러스터링에 대해서는 here 및 here).
기본 키는 의 역할을하기 때문에 서로 게이트 키를 사용하면 클라이언트 응용 프로그램에 유용한 의미가없고 쿼리에 사용할 수없는 순서로 실제로 테이블을 정렬합니다.
클러스터 된 테이블의 보조 인덱스는 힙 기반 테이블보다 "더 쓸만한"수 있으며 이중 조회가 필요할 수 있습니다. 이러한 이유로
, 당신은 서로 게이트를 방지하고 이와 유사한 더 "자연"키를 사용하고자하는 것 : 테이블에
({USER_ID, PICTURE_NO}
이 VOTE
참조를 PICTURE
에서 같은 이름의 필드 가능한 경우 *_ID
및 *_NO
필드의 정수를 사용하십시오. VOTE.VOTER_ID
은 USER.USER_ID
입니다.) 지정된 사용자의
- 사진 (
PICTURE
차/클러스터링 인덱스에 대한 간단한 범위 스캔 :) 이 물리적 모델은 매우 효율적인 쿼리를 가능하게 할 것이다.
- 주어진 사진에 투표 (
VOTE
기본/클러스터링 색인의 간단한 범위 스캔). 상황에 따라 실제로는 빠르기 때문에 합계를 PICTURE
에 캐시 할 필요가 없습니다.
주어진 사용자의 투표가 필요한 경우 VOTE
PK를 {VOTER_ID, USER_ID, PICTURE_NO}
으로 변경하십시오. 두 가지 (그림 투표와 사용자 투표)가 필요한 경우 기존 PK를 유지하고 {VOTER_ID, USER_ID, PICTURE_NO, VOTE_VALUE}
에 covering 색인을 만드십시오.
이노에서
1
. 클러스터링 키가 기본 데이터베이스와 다를 수있는 DBMS (예 : MS SQL Server)가 있습니다.
"sid"는 무엇입니까? 사용자 목록 (user_id *), 사진 테이블 (photo_id *) 및 투표 표 (user_id *, photo_id *, 투표)가 거의 있음을 알 수 있습니다. [* = (구성 요소) PRIMARY KEY. – Strawberry
sid = 대리 ID (자동 증가 인덱스 PK) – jerrytouille
[투표]는 투표 한 사용자에게만 사진의 "소유자"에게 FK가 필요하지 않으므로 photo_user_sid가 중복됩니다. 그게 도움이 되니? – CHill60