문제

가능한 복제 :
기본 키가 마음에 드십니까?

데이터베이스에서 PK로 사용하는 이점뿐만 아니라 Guid 사용의 이점을 알고 있습니다. 가이드가 본질적으로 128 비트 int이고 일반 int는 32 비트라는 점을 고려할 때 int는 공간 절약기입니다 (이 점은 일반적으로 대부분의 최신 시스템에서는 무의미합니다).

결국, 당신은 어떤 상황에서 당신은 int를 PK와 Guid로 사용하는 것을 볼 수 있습니까?

도움이 되었습니까?

해결책

Kimberley Tripp (sqlskills.com)이 있습니다 기사 Guid를 기본 키로 사용합니다. 그녀는 불필요한 오버 헤드 때문에 그것에 대해 조언합니다.

다른 팁

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

물론, 수동 쿼리 및 보고서 구조를 수행 할 때 INT는 눈에 더 쉽고 FK 사용을 통해 공간 소비가 추가 될 수 있습니다.

예를 들어 SQL Server가 실제로 ID PK를 사용하여 인서트가 많은 테이블을 처리하는 방법에 대한 측정 값을보고 싶습니다.

당신의 질문에 답하기 위해 : 결국, 어떤 상황에서 당신은 어떤 상황에서 당신은 PK와 Guid로 INT를 사용하는 것을 볼 수 있습니까?

내 시스템에 온라인/오프라인 버전이 오프라인 버전 내부에 데이터를 저장할 수 있고 데이터가 동기화되는 동안 언젠가 서버로 다시 전송되는 경우 Guid를 사용합니다. 그렇게하면 데이터베이스 내부에 동일한 키가 두 번 있지 않을 것이라고 확신합니다.

INT는 공간 절약체입니다 (이 점은 일반적으로 대부분의 현대 시스템에서는 무의미합니다).

별로. 언뜻보기에는 보일 수 있지만 각 테이블의 주요 키는 데이터베이스 전체에서 인덱스와 다른 테이블의 외래 키로 여러 번 반복됩니다. 그리고 테이블이 포함 된 거의 모든 쿼리에 관여 할 것입니다.

또한 현대 CPU는 매우 빠르지 만 RAM 속도는 유지되지 않았다는 것을 기억하십시오. 따라서 캐시 동작이 점점 더 중요해집니다. 좋은 캐시 동작을 얻는 가장 좋은 방법은 더 작은 데이터 세트를 갖는 것입니다. 따라서 4와 16 바이트의 겉보기에는 관련이없는 차이로 인해 속도가 눈에 띄게 나타날 수 있습니다. 항상 반드시 그런 것은 아니지만 고려해야 할 사항입니다.

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

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

모든 종류의 데이터베이스 마이그레이션에는 이점이 있습니다. 안내를 사용하면 충돌이 없습니다. INT가 정체성에 사용되는 여러 DBS를 병합하려고하면 해당 값을 대체해야합니다. 이러한 이전 값이 URL에 사용 된 경우 이제 SEO 히트 후에 달라집니다.

1 차와 외국의 키 관계와 같은 값을 비교할 때 INT가 더 빠릅니다. 테이블이 올바르게 색인되어 있고 테이블이 작 으면 속도가 느려지지 않을 수도 있지만 확실하게 시도해야합니다. INT는 또한 읽기가 더 쉽고 다른 사람들과 의사 소통합니다. "레코드 1234를 볼 수 있습니까?"라고 말하는 것이 훨씬 간단합니다. "레코드 031E9502-E283-4F87-9049-CE0E5C76B658을 볼 수 있습니까?"

일부 OS는 고유 한 하드웨어 기능 (CPUID, MAC)을 기반으로 더 이상 안내를 생성하지 않습니다. 왜냐하면 추적 사용자는 쉽게 추적했기 때문입니다 (개인 정보 문제). 이것은 많은 사람들이 생각하는 것처럼 안내 독창성이 더 이상 보편적이지 않다는 것을 의미합니다.

데이터베이스의 자동 ID 기능을 사용하는 경우 데이터베이스는 이론적으로 복제가 없도록 할 수 있습니다.

데이터가 단일 데이터베이스에 남아있는 경우 (일반적으로 작성하는 응용 프로그램의 대부분의 데이터와 같이) IDENTITY. 쉽고, 그런 식으로 사용되도록 의도되며, 클러스터 된 인덱스를 조각하지 않으며 충분합니다. 20 억의 일부 레코드 (음수 값을 사용하는 경우 ~ 40 억)의 공간이 부족하지만, 한 테이블에 많은 레코드가 있으면 어쨌든 토스트 될 것입니다. 그리고 데이터웨어 하우스 문제가 있습니다.

데이터가 여러 독립 데이터베이스 또는 타사 서비스와의 인터페이스에있는 경우 GUID 이미 생성되었을 가능성이 높습니다. 좋은 예는 데이터베이스의 userprofiles 테이블이 Active Directory의 사용자를 자신의 응용 프로그램에서 사용자 프로필에 맵핑하는 것입니다. objectGUID 그들에게 할당 된 그 활성 디렉토리.

어떤 단계에서 데이터베이스를 병합 할 계획 인 경우, 즉 다중 사이트 복제 유형 설정을 위해 Guid 's는 많은 고통을 저장합니다. 그러나 그 외에는 INT가 더 쉽습니다.

나는 항상 PK가 가능한 곳에 숫자가되어야한다고 생각합니다. PK로서 안내를 잊지 마십시오. 아마도 다른 테이블에서 foriegn 키로 사용되므로 페이징 및 인덱스 등이 커질 것입니다.

데이터베이스도 중요하다고 생각합니다. MySQL 관점에서 - 일반적으로 데이터 유형이 작을수록 성능이 빨라집니다.

int vs guid에도 적용되는 것 같습니다.http://kccoder.com/mysql/uuid-vs-int-insert-performance/

이 키가 비슷한 값으로 바인딩되는 경우에만 Guid를 PK로 사용합니다. 예를 들어, 사용자 ID (WinNT의 사용자는 GUID로 설명) 또는 사용자 그룹 ID를 설명합니다. 또 다른 예. 문서 관리를위한 분산 시스템을 개발하는 경우 전 세계 각지의 다른 장소에서 시스템의 다른 부분이 일부 문서를 만들 수 있습니다. 이 경우 분산 시스템의 다른 부분에 생성 된 2 개의 문서에 동일한 ID가 없을 것임을 보장하기 때문에 Guid를 사용합니다.

INT는 디버깅 할 때 읽기가 훨씬 쉽고 훨씬 작습니다.

그러나 제품의 라이센스 키와 유사한 안내 또는 이와 유사한 것을 사용합니다. 당신은 그것이 독특하다는 것을 알고 있으며, 그것이 순차적이지 않을 것이라는 것을 알고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top