2009-05-06 3 views
26

가능한 중복 :
How do you like your primary keys?GUID INT의 IDENTITY 대

나는 GUID를 사용의 이점뿐만 아니라 PK 같이 사용하고 INT의 장점을 알고 있어요 데이터베이스. GUID가 본질적으로 128 비트 INT이고 일반 INT가 32 비트 인 것을 고려하면 INT는 공간 보호기입니다 (이 점은 대부분의 최신 시스템에서는 일반적으로 사용하지 않지만).

결국 어떤 상황에서 INT를 PK 대 GUID로 사용하게됩니까?

+1

참고 :이 질문은 2009 년에 요청되었습니다. http://softwareengineering.stackexchange.com/a/337560/156440 및 http://stackoverflow.com/questions/11938044/what-are-the-best- 킴벌리 트립 (Kimberley Tripp)의 업데이트 된 조언에 대한 링크를 포함하여보다 최신의 답변을 얻으려면 실용적인 사용법을 기본 키 - 구체적으로 - 레가 (rega)로 지정하십시오. – HockeyJ

답변

18

GUID를 기본 키로 사용하는 경우 Kimberley Tripp (SQLSkills.com)의 암호가 an article입니다. 그녀는 불필요한 간접비 때문에 그것을 반대합니다.

+0

여전히 [이 시리즈] (http://sqlblogcasts.com/blogs/tonyrogerson/archive/2011/07.aspx)를 읽지는 못했지만 Tony Rogerson이 SSD를 사용하면 조각화 문제가 많이 줄어들 었다고 생각합니다. –

1

INT는 디버깅 할 때 확실히 쉽게 읽을 수 있으며 훨씬 더 작습니다.

그러나 제품의 라이센스 키로 GUID 또는 비슷한 것을 사용합니다. 당신은 그것이 유일 할 것이라는 것을 알고 있습니다, 당신은 이것이 순차적이지 않을 것이라는 것을 알고 있습니다.

7

기본 키와 외래 키 관계 같은 값을 비교할 때 INT가 빠릅니다. 테이블이 제대로 인덱싱되고 테이블이 작 으면 속도가 느려지지 않을 수도 있지만 확실하게 시도해야합니다. INT는 읽기 쉽고 다른 사람들과 의사 소통하기 쉽습니다. "1234 기록을 볼 수 있습니까?"라고 말하는 것이 훨씬 간단합니다. "031E9502-E283-4F87-9049-CE0E5C76B658 기록을 볼 수 있습니까?"

+0

항상 해시드를 사용하여 문제를 완화하십시오. http://hashids.org/ – Korayem

3

일부 OS는 추적 사용자를 쉽게 (개인 정보 보호 문제)하기 때문에 고유 하드웨어 기능 (CPUID, MAC)을 기반으로 GUID를 더 이상 생성하지 않습니다. 즉 GUID의 고유성은 더 이상 많은 사람들이 생각하는 것처럼 더 이상 보편적이지 않습니다.

데이터베이스의 일부 자동 ID 기능을 사용하는 경우 데이터베이스는 이론상 복제가 없다는 것을 절대적으로 확신 할 수 있습니다.

+0

요즘 일반적으로 무작위로 GUID가 생성됩니다. –

+0

@Marco이 문제를 뒷받침하는 문서에 대한 참고 자료를 제공해 줄 수 있습니까? 나는 이것에 대해 들어 본 적이 없다. –

+0

이것은 이미 오래된 뉴스입니다. 다른 사람들을 간단히 위키피디아 참조 http://en.wikipedia.org/wiki/Globally_unique_identifier 가장 중요한 알고리즘 섹션 –

2

언제나 PK의 숫자는 숫자 여야한다고 생각합니다. PK가 아마 foriegn 키처럼 다른 테이블에서도 사용된다는 것을 의미 할 것이므로 페이징과 인덱스 등이 더 커질 것이므로 GUID가 있다는 것을 잊지 마십시오.

+0

레코드의 자연 키가 숫자가 아닐 경우 예 : 로그 메시지 레코드의 경우 (호스트, 시간 소인) 또는 제품 레코드의 경우 (product_code)? 여분의 키를 가지고 있다는 것을 제외하고 아무런 목적도없는 숫자 필드를 추가하라고하십니까? – bignose

+0

아니요, 그렇지만 타임 스탬프 필드의 경우 ID 필드를 테이블에 추가하고이를 타임 스탬프 대신 키로 사용할 수 있습니다. 둘 다 DB에 의해 생성됩니다. 제품 코드의 경우 ID 번호로 변경해야하므로 ID 번호로 변경하지 않아도됩니다. 모두 저장하려는 데이터의 유형과 데이터베이스 설계 방법에 따라 다릅니다. – kevchadders

1

을 나는 단지이 키 경계 경우 유사한 값으로 PK로 GUID를 사용합니다. 예를 들어 사용자 ID (WinNT의 사용자는 GUID로 설명 됨) 또는 사용자 그룹 ID입니다. 또 다른 한 가지 예입니다. 문서 관리를위한 분산 시스템을 개발하고 전 세계 다른 곳에서 시스템의 다른 부분을 개발하면 문서를 만들 수 있습니다. 이 경우에는 분산 시스템의 다른 부분에서 작성된 두 개의 문서가 동일한 ID를 갖지 않으므로 GUID를 사용합니다.

12

질문에 대답하십시오 : 궁극적으로 어떤 상황에서 INT를 PK 대 GUID로 사용합니까?

내 시스템에 오프라인/오프라인 버전이있을 경우 데이터를 저장할 수있는 오프라인 버전 내부에 동기화 할 때 데이터가 서버로 다시 전송되는 경우 GUID를 사용합니다.그렇게하면 데이터베이스 내에 두 번 같은 키가 생기지 않을 것입니다.

2

데이터가 단일 데이터베이스에있는 경우 (일반적으로 쓰는 응용 프로그램의 대부분의 데이터처럼) IDENTITY을 사용합니다. 쉽게 사용할 수 있으며 클러스터 인덱스를 조각화하지 않고 사용하기에 충분합니다. 20 억 개의 레코드 (음수 값을 사용하는 경우 40 억 개)가 부족하지만 한 테이블에 많은 레코드가 있고 데이터웨어 하우징 문제가있는 경우에는 토스트가됩니다.

데이터가 여러 독립 데이터베이스 또는 타사 서비스의 인터페이스에있는 경우 이미 생성 된 가능성이있는 GUID을 사용합니다. 좋은 예는 Active Directory의 사용자를 Active Directory가 할당 된 objectGUID을 통해 응용 프로그램의 사용자 프로필에 매핑하는 데이터베이스의 UserProfiles 테이블입니다.

11

INT는 공간 절약 (이 점은 일반적으로 가장 현대적인 시스템의 이론에 불과하지만)입니다.

그렇지 않습니다. 첫눈에 보일지도 모르지만 각 테이블의 기본 키는 인덱스의 데이터베이스 전체에서 여러 번 반복되고 다른 테이블의 외래 키로 반복됩니다. 또한 테이블을 포함하는 거의 모든 쿼리에 참여하게 될 것이며 조인에 사용되는 외래 키일 때 매우 집중적으로 처리됩니다.

또한 최신 CPU는 매우 빠르지 만 RAM 속도는 올라가지 않았습니다. 따라서 캐시 동작이 점차 중요 해지고 있습니다. 그리고 좋은 캐시 동작을 얻는 가장 좋은 방법은 더 작은 데이터 세트를 갖는 것입니다. 따라서 4와 16 바이트 사이의 겉보기에 무관 한 차이는 속도면에서 눈에 띄는 차이를 유발할 수 있습니다. 반드시 그런 것은 아니지만 - 고려해야 할 사항입니다.

2

일부 단계에서 데이터베이스를 병합하려는 경우 (예 : 다중 사이트 복제 유형 설치) Guid 's는 많은 고통을 덜어줍니다. 하지만 그 외에는 Int의 편이 더 쉽습니다.

14

여러 데이터베이스 인스턴스를 동기화해야 할 때 좋지 않은 선택인데도 불구하고 INT에는 언급하지 않은 한 가지 단점이 있습니다. 삽입은 항상 인덱스 트리의 한쪽 끝에서 발생합니다. 이로 인해 많은 양의 이동이있는 테이블이있을 때 (동일한 인덱스 페이지는 동시 삽입에 의해 수정되어야하고 GUID는 인덱스 전체에 삽입되어야하므로) 잠금 경합이 증가합니다. B * 트리 또는 유사한 데이터 구조가 사용되는 경우 색인을 더 자주 재조정해야 할 수도 있습니다.

물론 수동 쿼리와 보고서 작성을 할 때 int가 더 쉬우 며 공간 사용량이 FK 사용을 통해 합산 될 수 있습니다.

나는 얼마나 잘 측정되었는지보고 싶습니다. SQL Server는 실제로 IDENTITY PK가있는 삽입이 많은 테이블을 처리합니다.

8

어디서나 매우 복잡한 엔터프라이즈 소프트웨어에 Guids가 있습니다. 원활하게 작동합니다.

나는 Guids가 의미 상으로 식별자로 적합하다고 생각합니다. 또한 당신이 그 문제에 직면 할 때까지 불필요하게 성능에 대해 걱정할 필요가 없습니다. 조숙 한 최적화를 조심하십시오.

데이터베이스 마이그레이션에 장점이 있습니다. Guides를 사용하면 충돌이 발생하지 않습니다. int가 ID로 사용되는 여러 DB를 병합하려고하면 값을 바꿔야합니다. 이러한 오래된 값이 URL에 사용 되었다면 이제는 SEO 히트에 따라 달라집니다.

+1

엔터프라이즈 소프트웨어에서 guid 클러스터링은 어떻게됩니까? – Koste