2012-02-11 2 views
1

외래 키를 숫자 ID로 사용해야합니까? 아니면 다른 값을 사용할 수 있습니까? 현재 ID를 사용하고 있지만 유효성 검사, 삽입 등을하기 전에 ID에 값을 변환하기 위해 테이블에 가입/쿼리를 계속해야합니다 (입력을 제외하고 코드에서 ID 대신 값을 참조합니다). 예를 들어 status 테이블이 있다고 가정 해보십시오. - 수치 ID를 없애고 값 ('활성', '일시 중지'등) 만 유지할 수 있습니까?MySQL 외래 키는 ID 또는 값을 사용합니까?

이것은 주로 리소스/다소 정적 인 테이블에 사용됩니다.

보너스 질문 : 조인 테이블에 id 필드가 필요합니까? 나는 그들의 목적을 보지 못한다.

가능합니까? 단점은? 제안?

답변

2

외래 키는 다른 종류의 열을 참조 할 수도 있습니다.

enum 당신이 효율적으로 사용하고자하는 몇 개의 다른 문자열을 가지고 있다면 추천합니다. 내부적으로 정수가되지만 대신에 이름을 사용할 수 있습니다. mysql reference

2

char 또는 다른 유형의 열이 외래 키로 사용되었을 수 있습니다. 문제는 열이 더 넓어지기 때문입니다. TINYINT은 256 개의 다른 상태를 저장할 수있을만큼 1 바이트가 필요합니다. A CHAR(10), 'Active', 'Suspended' 등을 저장할 수 있으므로 10 바이트가 필요합니다. 행뿐만 아니라 색인도 넓어집니다. 그리고 현대의 하드 디스크에서는 공간이 문제가되지 않지만 인덱스 크기는 효율성에 영향을줍니다.

그렇다면 성능 저하를 허용 할 수 있다면 숫자 ID를 제거하고 값만 유지하면됩니다.

또는, status 테이블의 기본 키로 CHAR(1)을 사용할 수 있습니다 (오프 물론 다른 테이블에서 외래 키로), 그래서 당신은 그것은 작동 등 'Suspended'에 대한 'S', 'Active'를 들어, 'A'을 가질 수 있습니다 만약 당신이 돈 26 가지 이상의 상태가 있습니다.

MySQL의 ENUM 유형이 여기에 빌 Karwin에 의해 대답에 설명 된 여러 가지 문제가 있습니다 만 성능상의 이유로 Mysql ENUM type vs join tables

+0

을, 나는 오직 FKS int 치의을 사용했다. –

+0

@MikePurcell : 그렇다면 자연스러운 키를 선호한다고 생각하십니까? 나도. –

+0

사실. 위대한 마음은 똑같이 생각합니다. –

관련 문제