기본 키로 UUID 또는 GUID를 사용하는 경우의 단점은 무엇입니까?


60

분산 시스템을 구축하고 싶습니다. 데이터베이스에 데이터를 저장해야하며 UUID 또는 GUID 를 일부 테이블의 기본 키로 사용하면 도움이됩니다 . UUID / GUID가 상당히 크고 거의 임의이기 때문에이 디자인의 단점이라고 생각합니다. 대안은 자동 증분 INT 또는 LONG을 사용하는 것입니다.

내 테이블의 기본 키로 UUID 또는 GUID를 사용하는 데 따른 단점은 무엇입니까?

아마도 Derby / JavaDB (클라이언트)와 PostgreSQL (서버)을 DBMS로 사용할 것입니다.


왜 도움이 되겠습니까? 어떤 단점에 가장 집중하고 있습니까? 이 모호한 모든 DB 질문에 대한 답변은 "의존합니다". 더 자세한 정보를 알려주시겠습니까? 읽기 또는 쓰기 성능에 가장 관심이 있습니까? 우리는 어떤 분포 수준에 대해 이야기하고 있습니까?
Brian Ballsun-Stanton

@Brian : 분산 시스템의 UUID는 클라이언트에서 기본 키를 생성 한 다음 서버에 비동기 적으로 데이터를 업로드 할 수 있으므로 유용합니다. 나는 주로 읽기 성능 단점에 대해 생각하고 있습니다. UUID에서 많은 JOIN을 사용하는 것이 그렇게 좋지 않을까요? 예를 들어 클라이언트는 인벤토리 시스템에 항목 (UUID, 이름, 공급 업체, 작성자)을 추가 한 다음 로컬 데이터베이스가 서버의 중앙 데이터베이스와 동기화됩니다.
Jonas

1
나는 이것에 대한 명확한 설명이 없다면 그것이 "의존적"이라고 생각한다. 그것들이 없으면 VtC로 갈 것입니다.
jcolebrand

다른 SQL 제품과 관련되어 있어도 흥미로울 수있는 SQL Server의 클러스터형 인덱스에 대한 GUID 및 비 GUID 영향에 대해 설명하는 기사가 있습니다. x.co/Twpp
Jeff

나는 것으로 나타났습니다 더비 문서가 데이터 유형으로 UUID를 나열하지 않습니다. UUID 데이터 유형을 나열하는 H2 데이터베이스 엔진 (Derby와 같은 순수 Java 데이터베이스)과 같은 대안을 고려할 수 있습니다 . 물론 Postgres는 UUID 값 을 효율적으로 저장 , 인덱싱 및 생성 하는 데 탁월한 지원을 제공 합니다.
Basil Bourque

답변:


29

최종 테이블의 생성 함수 및 크기에 따라 다릅니다.

GUID는 전역 적으로 고유 한 식별자로 사용됩니다. Postgres 8.3 설명서 에서 논의한 것처럼 이러한 식별자를 생성하는 데 보편적으로 적합한 방법론은 없지만 postgreSQL에는 몇 가지 유용한 후보가 제공됩니다.

문제의 범위와 오프라인 쓰기 의 필요성 에서 GUID 이외의 것을 사용하여 깔끔하게 상자를 만들었으므로 다른 체계의 보상 이점이 없습니다.

기능적인 관점에서 키 길이는 일반적으로 테이블 수에 따라 읽기 수와 크기에 따라 모든 종류의 최신 시스템에서 문제가되지 않습니다. 대안 방법으로 오프라인 클라이언트 는 기본 키 없이 새 레코드 일괄 처리 하고 다시 연결할 때 간단히 레코드 를 삽입 할 수 있습니다. postgreSQL은 "Serial"데이터 유형을 제공하므로 클라이언트는 데이터베이스에 간단한 쓰기를 수행 할 수있는 경우 ID를 결정할 필요가 없습니다.


3
젠장, 자네가 가서 브라이언이 그 질문에 대답하게 해줘 예, "오프라인 업데이트"에 대한 요구 사항으로 인해 전체 개념이 완전히 바뀌 었습니다.
jcolebrand

무아 하하하! :: twirls 콧수염 ::
Brian Ballsun-Stanton

1
오프라인 쓰기에서도 INT를 사용할 수 있습니다. 예를 들면 두 개의 열하여 {Node_ID, Item_ID}각 노드가 있습니다 Node_ID, 및 Item_ID노드 당 자동으로 증가된다.
조나스

@Jonas ~ 네, 가능합니다. 그러나 대부분의 사람들이 GUID를 고려 하는 이유 중 하나는 전역 적으로 분리 된 콘텐츠를 다른 데이터베이스에 복제하기위한 것입니다. 나는 그 용어 자체가 QED라는 것을 의미한다.
jcolebrand

마스터 / 슬레이브 아키텍처 또는 스파 스 연결 클라이언트 + 기본 서버 아키텍처와 관련하여 마스터에서 global_id (SERIAL)를 사용하고 슬레이브에서 global_id (BIGINT) + local_id (SERIAL)를 사용하는 것이 가능할 수 있습니다. 슬레이브는 local_id를 사용하여 로컬 작업을 수행하고 마스터로 향할 수있을 때 커밋하고, 마스터는 데이터를 수신하여 해당 데이터를 슬레이브에 반환하는 global_id를 부여합니다. 노예).
Mihai Stancu

22

한 가지 더 조언-GUID를 클러스터형 인덱스의 일부로 사용하지 마십시오. GUID는 순차적이지 않으므로 클러스터 된 인덱스의 일부인 경우 새 레코드를 삽입 할 때마다 int (bigint) 자동 증가의 경우 데이터베이스가 모든 메모리 페이지를 재정렬하여 삽입 할 적절한 위치를 찾아야합니다. 마지막 페이지 일 것입니다.

이제 DB 구현을 살펴보면 다음과 같습니다. 1.) MySQL-기본 키가 클러스터링되며 동작을 변경할 수있는 옵션이 없습니다. 권장 사항은 GUID를 전혀 사용하지 않는 것입니다. 2.) Postgres, MS-SQL-GUID를 다음과 같이 만들 수 있습니다. 기본 키가 클러스터되지 않은 상태에서 다른 필드를 클러스터 된 인덱스로 사용하십시오 (예 : autoincrement int).


Postgres에 제안하는 것은 auto_increment PK (클러스터 키), 고유 인덱스가있는 GUID (클러스터되지 않음)와 약간 다른 구조로 MySQL에서도 수행 할 수 있습니다.
ypercubeᵀᴹ

항상 그런 것은 아닙니다. 디스크 시스템 처리량에 따라 마지막 페이지에 대한 액세스 동기화가 병목 현상 일 수 있습니다. blog.kejser.org/2011/10/05/…
mwilson

2
"Microsoft SQL Server와 달리 PostgreSQL의 인덱스에 대한 클러스터링은 해당 순서를 유지하지 않습니다. 순서를 유지하려면 CLUSTER 프로세스를 다시 적용해야합니다." CLUSTER의 ON 인덱스 성능 향상 않는 방법
BARTOLO-otrit

: 정보 @의 BARTOLO-otrit의 축소 된 버전에 연결 stackoverflow.com/a/4796685/1394393 . 이 질문은 PG에 관한 것이며 존재하지 않는 SQL Server 및 MySQL과 유사하다고 가정하기 때문에이 대답은 실제로 관련이없는 것 같습니다.
jpmc26

database would need to rearrange all its memory pages to find the right place for insertion=> 클러스터링은 선택 사항이며 새 행은 순서가 정해지지 않으므로 Postgres의 경우는 아닙니다.
Flavien

3

따라 다릅니다.

진지하게, 당신이 지금까지했던 모든 것에 대해, 이것은 당신이 갈 수있는 한도입니다.

UUID를 사용하는 것이 왜 도움이됩니까? 왜 INT를 사용하지 않습니까? 나중에 UUID를 색인 할 수없는 이유는 무엇입니까? UUID 키를 사용하여 정렬 된 목록을 갖고 몇 백만 행 뒤에 임의의 (순차적이지 않은) UUID를 삽입하는 것이 무엇을 의미하는지 알고 있습니까?

어떤 플랫폼에서 실행됩니까? 디스크는 몇 개입니까? 얼마나 많은 사용자? 몇 개의 기록이 있습니까?


7
필자가 작성한 의견에서 UUID를 사용하면 클라이언트가 서버에 연결하지 않고 데이터베이스에 행을 추가하고 나중에 서버와 동기화 할 수 있습니다. 기본 키에 INT를 사용하면 여러 클라이언트가 서로 다른 항목에 동일한 기본 키를 사용할 수 있으므로 그렇게 할 수 없습니다. 글쎄, UUID 열에서 목록을 정렬하는 것은 쓸모가 없으며 타임 스탬프 열에서 정렬하는 것이 더 유용합니다. 아니요, 몇 백만 행 후에 임의의 비 순차 UUID를 삽입하는 것이 무엇을 의미하는지 알 수 없으므로이 질문을합니다.
Jonas

응용 프로그램은 Java로 작성되며 클라이언트는 Windows, Mac 또는 Linux를 사용합니다. 클라이언트는 일반적으로 디스크가 하나 인 공통 데스크탑 컴퓨터를 사용합니다. 사용자 및 레코드 수는 고객 수에 따라 다르지만 고객 및 고객 당 약 5000 명입니다.
Jonas

1
오프라인 의견이 모든 것을 바 꾸었습니다. 자세한 내용은 무엇입니까?
jcolebrand
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.