복붙노트

[SQL] 데이터베이스 좋은지 나쁜지에 VARCHAR 외부 키로 / 기본 키?

SQL

데이터베이스 좋은지 나쁜지에 VARCHAR 외부 키로 / 기본 키?

외국 키로 대신 VARCHAR의 S : 나는 ID의 NR을 사용하는 경우 더 나은가요? 그리고 더 나은 ID의 NR을 사용하는 것입니다 : 대신 기본 키와 같은 VARCHAR의이야? ID 별 NR I 평균 INT!

이것은 내가 지금 가지고있는 것입니다 :

category table:
cat_id ( INT ) (PK)
cat_name (VARCHAR)

category options table:
option_id ( INT ) (PK)
car_id ( INT ) (FK)
option_name ( VARCHAR ) 

내가 본을 가질 수 생각 :

category table:
cat_name (VARCHAR) (PK)

category options table:
cat_name ( VARCHAR ) (FK)
option_name ( VARCHAR ) ( PK )

아니면 내가 완전히 잘못 여기 생각하고있다?

해결법

  1. ==============================

    1.어떤 키에 사용되는 VARCHAR의 문제는 그들이 공백을 가질 수 있다는 것입니다. 공백은 테이블 끝에 여분의 공백 레코드를 반환하지 않는 이유를 아래로 사냥을 시작할 때 당신의 생활을 어렵게 만들 수있는 열쇠로 VARCHAR를 사용하는 등 공간 탭, 캐리지 리턴과 같은 비 화면을 읽을 수있는 문자로 구성 자신의 키.

    어떤 키에 사용되는 VARCHAR의 문제는 그들이 공백을 가질 수 있다는 것입니다. 공백은 테이블 끝에 여분의 공백 레코드를 반환하지 않는 이유를 아래로 사냥을 시작할 때 당신의 생활을 어렵게 만들 수있는 열쇠로 VARCHAR를 사용하는 등 공간 탭, 캐리지 리턴과 같은 비 화면을 읽을 수있는 문자로 구성 자신의 키.

    물론, 당신은 VARCHAR를 사용할 수 있지만, 당신은 입력 및 출력에 매우 조심해야 않습니다. 그들은 또한 더 많은 공간을 차지하고 쿼리를 수행 할 때 가능성이 느립니다.

    정수 유형은 0,1,2,3,4,5,6,7,8,9이 유효 10 개 문자의 작은 목록을 가지고있다. 그들은 키로 사용할 수있는 더 나은 솔루션입니다.

    당신은 항상 정수 기반의 키를 사용하고 빠른 조회의 장점을 가지고 싶어 경우 UNIQUE 값으로 VARCHAR를 사용할 수 있습니다.

  2. ==============================

    2.내가 보장 할 수 있음이 데이터에 아무것도 가지고 NULL이 아닌, 고유 불변 될 것입니다 : 내가 디자인 작업을하고있을 때 내 자신에게 물어? 즉, 그래서 후보 기본 키가 될 경우. 그렇지 않은 경우, 내가 사용하는 키 값을 생성 할 수 있습니다 알고 있습니다. 내 후보 키는 VARCHAR 내가 다음 데이터를 보면 될 일이 있는지, 다음, 가정. 그 길이가 비교적 짧은 (의미, 20 자, 말할 이하)? 또는 VARCHAR 필드는 오히려됩니까? 이 짧다 경우는 키로서 사용 가능 - 그것은 긴 있다면, 아마도 그것은 (그것이 내가 아마 어쨌든 인덱스에있는거야 기본 키 것에 대해 고려 있는지 있지만) 키로 사용하지하는 것이 좋습니다. 내 우려의 적어도 일부에서 기본 키 인덱스해야 할 것입니다 그리고 아마도 다른 테이블에서 외래 키로 사용되는 것입니다. VARCHAR 필드의 비교는 숫자 필드 (예 정수로서 특히 이진 숫자 필드) 성능 저하가 발생할 수 키로 긴 VARCHAR 필드를 사용하므로 비교보다 더 느린 경향이있다. YMMV.

    내가 보장 할 수 있음이 데이터에 아무것도 가지고 NULL이 아닌, 고유 불변 될 것입니다 : 내가 디자인 작업을하고있을 때 내 자신에게 물어? 즉, 그래서 후보 기본 키가 될 경우. 그렇지 않은 경우, 내가 사용하는 키 값을 생성 할 수 있습니다 알고 있습니다. 내 후보 키는 VARCHAR 내가 다음 데이터를 보면 될 일이 있는지, 다음, 가정. 그 길이가 비교적 짧은 (의미, 20 자, 말할 이하)? 또는 VARCHAR 필드는 오히려됩니까? 이 짧다 경우는 키로서 사용 가능 - 그것은 긴 있다면, 아마도 그것은 (그것이 내가 아마 어쨌든 인덱스에있는거야 기본 키 것에 대해 고려 있는지 있지만) 키로 사용하지하는 것이 좋습니다. 내 우려의 적어도 일부에서 기본 키 인덱스해야 할 것입니다 그리고 아마도 다른 테이블에서 외래 키로 사용되는 것입니다. VARCHAR 필드의 비교는 숫자 필드 (예 정수로서 특히 이진 숫자 필드) 성능 저하가 발생할 수 키로 긴 VARCHAR 필드를 사용하므로 비교보다 더 느린 경향이있다. YMMV.

  3. ==============================

    3.제 2 센트 :

    제 2 센트 :

    기본 키 또는 인덱스로 CHAR 또는 VARCHAR를 사용하여 성능 관점에서 악몽이다.

    나는 화합물 기본 키 (INT + CHAR, INT + VARCHAR, INT + INT)를 테스트했는데 지금까지 INT + INT는 (데이터웨어 하우스를로드) 최고의 성능이었다. 당신은 단지 숫자 기본 키 / 인덱스를 유지하는 경우 두 번 더 성능에 대해 말할 수 있습니다.

  4. ==============================

    4.당신이 ID에 카테고리 이름을 경우 당신이 이제까지 카테고리의 이름을 변경하기로 결정한 경우 당신은 문제가있는 것입니다.

    당신이 ID에 카테고리 이름을 경우 당신이 이제까지 카테고리의 이름을 변경하기로 결정한 경우 당신은 문제가있는 것입니다.

  5. ==============================

    5.당신이 사용은 2 바이트의 오버 헤드도있다으로 VARCHAR 경우 당신이 그것을 저장할 수있는 10 바이트 정도가 필요 없습니다으로 VARCHAR로 int로 사용하면 4 바이트에 20 억을 저장할 수 있습니다

    당신이 사용은 2 바이트의 오버 헤드도있다으로 VARCHAR 경우 당신이 그것을 저장할 수있는 10 바이트 정도가 필요 없습니다으로 VARCHAR로 int로 사용하면 4 바이트에 20 억을 저장할 수 있습니다

    그래서 지금 당신은 모든 PK에 6 개의 추가 바이트를 추가하고 FK + 2 바이트 VARCHAR 오버 헤드

  6. ==============================

    6.나는 기본 및 외래 키 모두로 VARCHAR를 사용하는 괜찮 말할 것입니다.

    나는 기본 및 외래 키 모두로 VARCHAR를 사용하는 괜찮 말할 것입니다.

    단지 당신이 테이블이있는 경우 예견이 할 수 발급, 인스트루먼트 (주 악기를) 말할 수 그리고 당신은 VARCHAR로 PRIMARY / FOREIGN KEY를 작성하고, 그 코드 변경을 발생합니다.

    이 증권 거래소에 일어나는가 및 ID의 NR로 당신에게서이 필요하지 않습니다이 코드에 대한 모든 참조 이름을 변경해야하는 것입니다.

    결론 그래서, 나는이 사용 목적에 따라 달라집니다 말할 것입니다.

    편집하다

    내가 코드를 말할 때, 나는하자의 말 좋은, 또는 다른 공유에 대한 티커 코드를 의미한다. 이 코드는 시간이 지남에 변경하는 것이 가능하다, 당신은 파생 상품 /의 미래 악기 살펴 말할 수 있습니다.

  7. ==============================

    7.천연 또는 대리 키 :이 질문은 더있는 일반적인 인수를 시작할 수도 있지만 하나 접근 아무것도 잘못이있다.

    천연 또는 대리 키 :이 질문은 더있는 일반적인 인수를 시작할 수도 있지만 하나 접근 아무것도 잘못이있다.

    당신은 기본 키로 CHAR 또는 VARCHAR를 사용하는 경우 당신은 몇 가지 점에서 외래 키로 사용하게 될 겁니다. 언제 내려 그것에 관해서 @astander 말한대로, 그것은 당신의 데이터에 의존하고 어떻게 그것을 사용하는 것입니다.

  8. from https://stackoverflow.com/questions/2103322/varchar-as-foreign-key-primary-key-in-database-good-or-bad by cc-by-sa and MIT license