2010-02-02 3 views
48

테이블에 기본 키로 자동 증가 정수를 추가할지 여부를 결정하는 "최상의 방법"을 파악하려고합니다.자동 증가 기본 키는 언제 사용합니까?

화학 원소에 대한 데이터가 포함 된 표가 있다고 가정 해 보겠습니다. 각 요소의 원자 번호는 고유하며 절대 변경되지 않습니다. 따라서 각 열에 대해 자동 증가 정수를 사용하는 대신 원자 번호를 사용하는 것이 더 정확할 것입니다. 맞습니까?

도서가있는 경우에도 마찬가지입니까? 기본 키에 ISBN 또는 자동 증가 정수를 사용해야합니까? 또는 각 직원의 SSN이 포함 된 직원의 테이블?

+1

+1 나는 사람들이 이것에 대해 무엇을 말하는지에 관심이있다. –

+1

이 질문은, 다양한 형태로, 다소 다년생하다 ... http://stackoverflow.com/questions/532363/native-primary-key-or - 자동 생성 - 예를 들어. – mjv

+0

이것은 실제로 대답 할만한 가치가 없지만 여기에 제 의견이 있습니다. 같은 ISBN을 가진 두 권의 책이나 같은 SSN을 사용하는 두 명의 책을 절대 갖고 싶지 않다면, 그 값들을 기본 키로 사용하는 것을 망설이지는 않을 것입니다. . 그러나 그것은 내가 생각하는 습관 일뿐입니다. Django의 모델과 같은 일부 ORM 시스템에서는이 작업을 수행하기가 매우 어려우며 항상 숫자 증분 ID가 있어야한다고 주장합니다. 한편, PostgreSQL을 사용하는 경우 * 이중 기본 키 *와 같은 작업을 수행 할 수도 있습니다. 내가 할 수있을 때마다 나는 그것을 사용하고 싶다. –

답변

13

질문에 많은 도움이되는 Stack Overflow에 대한 많은 질문이 이미 있습니다. here, here, herehere을 참조하십시오.

당신이 찾고 있어야하는 용어 : surrogated keys.

희망이 있습니다.

+0

Ah. 감사. 나는 조금 주위를 검색하지만 키워드를 적절히 구사하는 방법을 알 수 없었다. – jamieb

+0

굉장합니다. 기꺼이 도와주세요. –

4

아이디어가 있습니다.

모델링중인 항목에 대해 고유 키가없는 경우 자동 증가를 고유 키로 사용해야합니다. 그래서 Elements의 경우 원자 번호 또는 도서 ISBN 번호를 사용할 수 있습니다.

그러나 사람들이 메시지 게시판에 메시지를 게시하는 경우 고유 ID가 필요하지만 자연스럽게 포함하지 않아 목록에서 다음 번호를 할당합니다. 그것은 가능한 단지 기본 키로 필드하게하고 성능

+1

"고유 한 키가없는 경우 자동 증가가 고유 키로 사용되어야합니다"- 더 이상 동의 할 수 없습니다. – onedaywhen

2

내가 결정하는 "모범 사례"를 알아 내기 위해 노력하고있어에 대한 색인이되어 있는지 확인하는 것을 잊지 자연 키를 사용하여 의미를

자동 증분 정수를 기본 키로 테이블에 추가할지 여부.

PKey가 사용자 관리 데이터의 일부가 아닌 데이터 세트의 고유 식별자로 사용하십시오.

화학 원소에 대한 데이터가 포함 된 표가 있다고 가정 해 보겠습니다. 각 요소의 원자 번호는 고유하며 절대 변경되지 않습니다. 따라서 각 열에 대해 자동 증가 정수를 사용하는 대신 원자 번호를 사용하는 것이 더 정확할 것입니다. 맞습니까?

예.

도서가있는 경우에도 마찬가지입니까? 기본 키에 ISBN 또는 자동 증가 정수를 사용해야합니까? 또는 각 직원의 SSN이 포함 된 직원의 테이블?

ISBN/SS #는 제 3 자에 의해 할당되며 큰 저장 공간 크기로 인해 행을 고유하게 식별하는 데 매우 비효율적입니다. PKeys는 테이블을 조인 할 때 유용합니다. Integer와 같은 작고 압축 된 형식을 사용할 수있는 경우 Unique 식별자로 수많은 텍스트 문자를 사용하는 ISBN과 같은 대형 데이터 형식을 사용해야하는 이유는 무엇입니까?

+0

"화학 원소에 관한 데이터를 담고있는 테이블을 가지고 있다고 가정 해 봅시다. 아마 원자 숫자를 사용하는 것이 더 합리적 일 것입니다."- 원자량, 기호 및 숫자의 3 가지 키가 있음을 주목하십시오. 모두 데이터베이스 테이블에서 고유 한 제약 조건을 가져야합니까? 하나를 기본 키로 선택할 가치가 있습니까? 그렇다면 어떤 기준에 따라? 추신. 이 질문들에 대한 '정확한'대답은 없습니다 :) – onedaywhen

+0

'CHAR (13)'값이 "크고"매우 비효율적입니까? – onedaywhen

2

정수 접근법을 증가시키는 자동 문제는 데이터를 다른 db 인스턴스로 가져 오거나 아카이브 및 복원 작업으로 가져올 때 발생합니다.정수는 참조하는 데이터와 관련이 없기 때문에 기존 데이터베이스에 데이터를 복원하거나 추가 할 때 중복 여부를 판별 할 수있는 방법이 없습니다. 행에 포함 된 데이터와 PK 사이에 관계가 없으면 GUID 만 사용합니다. 눈으로 보는 사용자 친화적이지는 않지만 위의 문제를 해결합니다.

3

ISBN과 SSN을 사용하는 것과 관련하여 다른 테이블의 행이 외래 키를 통해 얼마나 많은 행을 차지하는 지 생각해보십시오. 그 이유는 이들 ID가 정수보다 훨씬 많은 공간을 차지하므로 낭비로 이어질 수 있기 때문입니다 디스크 공간이 부족하여 조인 성능이 저하 될 수 있습니다.

+0

"정수보다 훨씬 많은 공간을 차지하므로 디스크 공간 낭비가 발생할 수 있습니다"- 2012 년 인사말 (거의, 거의!) : 이제 디스크 공간이 칩 : – onedaywhen

+1

@onedaywhen 가입 실적은 2012 년에도 여전히 고려해야 할 사항입니다 .-P –

9

이 질문은 양측에 많은 감정을 불러 일으키는 매우 논쟁적인 질문입니다.

ISBN처럼 사용 가능한 유용한 자연 키가 있다면 겸허히 생각합니다. 사용합니다. 어쨌든 데이터베이스에 저장하겠습니다. 예, 자연 키는 일반적으로 정수 자동 증가 키보다 큽니다. 그러나이 문제는 과장되었습니다. 디스크 공간은 현재 저렴합니다. 처리하는 데 시간이 오래 걸리는 것에 대해 더 걱정할 것입니다. 80 바이트 텍스트 필드를 기본 키로 말하면 안된다고 말하고 싶습니다. 그러나 8 바이트 정수 대신 10 바이트 ISBN을 사용하려는 경우 성능이 저하 될 수 있다고 생각하지 않습니다.

때때로 자연 키에는 성능 이점이 있습니다. 예를 들어, 주어진 책의 사본 몇 개가 팔리고 있는지를 알고 싶다고 가정 해 봅시다. 도서 마스터 레코드의 데이터는 신경 쓰지 않습니다. 기본 키가 ISBN 인 경우, "isbn = '143573338X'"와 같이 "select count (*) from sale"이라고 쓸 수 있습니다. 자동 증가 키를 사용하면 isbn을 조회하기 위해 조인을해야하며 쿼리는 "bookcount를 사용하여 책 조인 판매에서 셀 수 (*)를 isbn = '143573338X'와 같이 더 복잡하고 느리게됩니다. ". (그리고 나는이 특별한 ISBN이 나의 책을 위해 판매 기록의 수가 아주 적기 때문에 참여하고 1 개의 여분의 레코드를 읽는 것이 큰 퍼센트 차이입니다!)

자연의 또 다른 이점 키를 사용하면 데이터베이스에서 작업해야하고이 테이블을 키로 다시 참조하는 레코드를 볼 때 참조하는 레코드를 쉽게 볼 수 있습니다.

한편, 선명하고 자연스러운 키가 없다면 미친 듯이 자갈을 넣지 마십시오. 나는 사람들이 처음으로 고객 이름, 출생 연도 및 우편 번호의 처음 6 글자를 연결하여 고유 한 키를 만들려고 노력한 것을 보았습니다. 그런 다음 고유 한 것으로기도합니다. 그 종류의 어리 석음은 너 자신을 위해 다만 말썽을 만들고있다. 사람들은 종종 고유 번호를 보장하기 위해 일련 번호를 사용하기 시작합니다. 그 시점에서 왜 귀찮은가요? 왜 그 자체로 시퀀스 번호를 키로 사용하지 않는가?

0

내가 아는 한 가지 다른 점은 대부분의 RDBMS가 PK를 사용하여 디스크에 블록을 배치했기 때문에 자동 증가 PK를 사용하면 단순히 대량으로 경쟁을 늘릴 수 있다는 것입니다. 이 문제는 아기 데이터베이스에 문제가되지는 않지만 더 큰 도시 끝에서 대규모 성능 문제를 일으킬 수 있다고 생각합니다. 당신이 자동 증가 ID를 사용해야하는 경우

는, 어쩌면 PK의 일부로 사용하는 것이 좋습니다. 독창성을 유지하기 위해 마지막에 붙이십시오 .....

또한 대리인에게 점프하기 전에 자연스러운 PK에 대한 모든 가능성을 피하는 것이 가장 좋습니다. 사람들은 일반적으로 이것으로 게으르다.