[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.어떤 키에 사용되는 VARCHAR의 문제는 그들이 공백을 가질 수 있다는 것입니다. 공백은 테이블 끝에 여분의 공백 레코드를 반환하지 않는 이유를 아래로 사냥을 시작할 때 당신의 생활을 어렵게 만들 수있는 열쇠로 VARCHAR를 사용하는 등 공간 탭, 캐리지 리턴과 같은 비 화면을 읽을 수있는 문자로 구성 자신의 키.
어떤 키에 사용되는 VARCHAR의 문제는 그들이 공백을 가질 수 있다는 것입니다. 공백은 테이블 끝에 여분의 공백 레코드를 반환하지 않는 이유를 아래로 사냥을 시작할 때 당신의 생활을 어렵게 만들 수있는 열쇠로 VARCHAR를 사용하는 등 공간 탭, 캐리지 리턴과 같은 비 화면을 읽을 수있는 문자로 구성 자신의 키.
물론, 당신은 VARCHAR를 사용할 수 있지만, 당신은 입력 및 출력에 매우 조심해야 않습니다. 그들은 또한 더 많은 공간을 차지하고 쿼리를 수행 할 때 가능성이 느립니다.
정수 유형은 0,1,2,3,4,5,6,7,8,9이 유효 10 개 문자의 작은 목록을 가지고있다. 그들은 키로 사용할 수있는 더 나은 솔루션입니다.
당신은 항상 정수 기반의 키를 사용하고 빠른 조회의 장점을 가지고 싶어 경우 UNIQUE 값으로 VARCHAR를 사용할 수 있습니다.
-
==============================
2.내가 보장 할 수 있음이 데이터에 아무것도 가지고 NULL이 아닌, 고유 불변 될 것입니다 : 내가 디자인 작업을하고있을 때 내 자신에게 물어? 즉, 그래서 후보 기본 키가 될 경우. 그렇지 않은 경우, 내가 사용하는 키 값을 생성 할 수 있습니다 알고 있습니다. 내 후보 키는 VARCHAR 내가 다음 데이터를 보면 될 일이 있는지, 다음, 가정. 그 길이가 비교적 짧은 (의미, 20 자, 말할 이하)? 또는 VARCHAR 필드는 오히려됩니까? 이 짧다 경우는 키로서 사용 가능 - 그것은 긴 있다면, 아마도 그것은 (그것이 내가 아마 어쨌든 인덱스에있는거야 기본 키 것에 대해 고려 있는지 있지만) 키로 사용하지하는 것이 좋습니다. 내 우려의 적어도 일부에서 기본 키 인덱스해야 할 것입니다 그리고 아마도 다른 테이블에서 외래 키로 사용되는 것입니다. VARCHAR 필드의 비교는 숫자 필드 (예 정수로서 특히 이진 숫자 필드) 성능 저하가 발생할 수 키로 긴 VARCHAR 필드를 사용하므로 비교보다 더 느린 경향이있다. YMMV.
내가 보장 할 수 있음이 데이터에 아무것도 가지고 NULL이 아닌, 고유 불변 될 것입니다 : 내가 디자인 작업을하고있을 때 내 자신에게 물어? 즉, 그래서 후보 기본 키가 될 경우. 그렇지 않은 경우, 내가 사용하는 키 값을 생성 할 수 있습니다 알고 있습니다. 내 후보 키는 VARCHAR 내가 다음 데이터를 보면 될 일이 있는지, 다음, 가정. 그 길이가 비교적 짧은 (의미, 20 자, 말할 이하)? 또는 VARCHAR 필드는 오히려됩니까? 이 짧다 경우는 키로서 사용 가능 - 그것은 긴 있다면, 아마도 그것은 (그것이 내가 아마 어쨌든 인덱스에있는거야 기본 키 것에 대해 고려 있는지 있지만) 키로 사용하지하는 것이 좋습니다. 내 우려의 적어도 일부에서 기본 키 인덱스해야 할 것입니다 그리고 아마도 다른 테이블에서 외래 키로 사용되는 것입니다. VARCHAR 필드의 비교는 숫자 필드 (예 정수로서 특히 이진 숫자 필드) 성능 저하가 발생할 수 키로 긴 VARCHAR 필드를 사용하므로 비교보다 더 느린 경향이있다. YMMV.
-
==============================
3.제 2 센트 :
제 2 센트 :
기본 키 또는 인덱스로 CHAR 또는 VARCHAR를 사용하여 성능 관점에서 악몽이다.
나는 화합물 기본 키 (INT + CHAR, INT + VARCHAR, INT + INT)를 테스트했는데 지금까지 INT + INT는 (데이터웨어 하우스를로드) 최고의 성능이었다. 당신은 단지 숫자 기본 키 / 인덱스를 유지하는 경우 두 번 더 성능에 대해 말할 수 있습니다.
-
==============================
4.당신이 ID에 카테고리 이름을 경우 당신이 이제까지 카테고리의 이름을 변경하기로 결정한 경우 당신은 문제가있는 것입니다.
당신이 ID에 카테고리 이름을 경우 당신이 이제까지 카테고리의 이름을 변경하기로 결정한 경우 당신은 문제가있는 것입니다.
-
==============================
5.당신이 사용은 2 바이트의 오버 헤드도있다으로 VARCHAR 경우 당신이 그것을 저장할 수있는 10 바이트 정도가 필요 없습니다으로 VARCHAR로 int로 사용하면 4 바이트에 20 억을 저장할 수 있습니다
당신이 사용은 2 바이트의 오버 헤드도있다으로 VARCHAR 경우 당신이 그것을 저장할 수있는 10 바이트 정도가 필요 없습니다으로 VARCHAR로 int로 사용하면 4 바이트에 20 억을 저장할 수 있습니다
그래서 지금 당신은 모든 PK에 6 개의 추가 바이트를 추가하고 FK + 2 바이트 VARCHAR 오버 헤드
-
==============================
6.나는 기본 및 외래 키 모두로 VARCHAR를 사용하는 괜찮 말할 것입니다.
나는 기본 및 외래 키 모두로 VARCHAR를 사용하는 괜찮 말할 것입니다.
단지 당신이 테이블이있는 경우 예견이 할 수 발급, 인스트루먼트 (주 악기를) 말할 수 그리고 당신은 VARCHAR로 PRIMARY / FOREIGN KEY를 작성하고, 그 코드 변경을 발생합니다.
이 증권 거래소에 일어나는가 및 ID의 NR로 당신에게서이 필요하지 않습니다이 코드에 대한 모든 참조 이름을 변경해야하는 것입니다.
결론 그래서, 나는이 사용 목적에 따라 달라집니다 말할 것입니다.
편집하다
내가 코드를 말할 때, 나는하자의 말 좋은, 또는 다른 공유에 대한 티커 코드를 의미한다. 이 코드는 시간이 지남에 변경하는 것이 가능하다, 당신은 파생 상품 /의 미래 악기 살펴 말할 수 있습니다.
-
==============================
7.천연 또는 대리 키 :이 질문은 더있는 일반적인 인수를 시작할 수도 있지만 하나 접근 아무것도 잘못이있다.
천연 또는 대리 키 :이 질문은 더있는 일반적인 인수를 시작할 수도 있지만 하나 접근 아무것도 잘못이있다.
당신은 기본 키로 CHAR 또는 VARCHAR를 사용하는 경우 당신은 몇 가지 점에서 외래 키로 사용하게 될 겁니다. 언제 내려 그것에 관해서 @astander 말한대로, 그것은 당신의 데이터에 의존하고 어떻게 그것을 사용하는 것입니다.
from https://stackoverflow.com/questions/2103322/varchar-as-foreign-key-primary-key-in-database-good-or-bad by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] PostgreSQL를 9.3로 가져 오기 엑셀 데이터 (0) | 2020.06.03 |
---|---|
[SQL] 하지 액세스 SqlTransaction 객체는 catch 블록에서 롤백 할 수 (0) | 2020.06.03 |
[SQL] 나는 CASCADE DELETE 규칙을 사용해야합니까? [복제] (0) | 2020.06.03 |
[SQL] 어떻게 PostgreSQL 데이터베이스 테이블의 컬럼의 위치를 변경합니까? (0) | 2020.06.03 |
[SQL] 안드로이드에서 준비된 문으로 쿼리? (0) | 2020.06.03 |