4

가능한 중복 :
Advantages and disadvantages of GUID/UUID database keys언제 GUID를 기본 키로 사용 하시겠습니까?

SQL 서버 8분의 2,005 DB에서 기본 키 같은 GUID를 사용하는 것이 필수적이다 어떤 상황이 있습니다. 예를 들어 MS Sync Framework를 사용하면 데이터 복제가 강제로 수행됩니까?

+0

죄송합니다.이 URL은 http://stackoverflow.com/questions/45399/advantages-and-disadvantages-of-guid-uuid-data와 중복됩니다. 기본 키. 지금 해 보겠습니다. –

답변

16

복제를 통해 여러 데이터베이스를 동기화해야한다면 guids를 키로 사용하십시오.

GUID를 사용하는 또 다른 이유는 이렇게하면

난 강력하게 제안 당신이 윈폼 응용 프로그램 예를 들어, 일부 원격 클라이언트에 행을 만든 다음 웹 서비스 등을 통해 서버에 그 제출하기를 원한다면 당신이 고유하지 않은 자동 증가 int를 기반으로 자체 클러스터 된 인덱스를 지정해야합니다. 클러스터 된 인덱스가 GUID 인 테이블에 행을 삽입하는 데 상당한 오버 헤드가 발생할 수 있습니다.

업데이트 :

INSERT INTO myTable VALUES(NEWID(), 'Some useful data goes here') 

업데이트 :

CREATE TABLE [dbo].[myTable](
[intId] [int] IDENTITY(1,1) NOT NULL, 
[realGuidId] [uniqueidentifier] NOT NULL, 
[someData] [varchar](50) NULL, 
    CONSTRAINT [PK_myTable] UNIQUE NONCLUSTERED 
    (
    [realGuidId] ASC 
    ) 
) 

CREATE CLUSTERED INDEX [IX_myTable] ON [dbo].[myTable] 
(
[intId] ASC 
) 

당신은 보통 예를 들어, 같은 테이블에 삽입합니다 : 다음과 같은 테이블을 설정하는 방법에 대한 예는 내가 듣고 이것에 관해 이야기하는 정말 좋은 dotnetrocks 에피소드 - 듣고 가치있는 이야기 - Show #447

+0

그냥 PK를 배포/복제 목적의 GUID로 남겨두고 싶지만 (복제 후에) 여러 개의 동일한 항목이 포함될 수있는 새로운 고유하지 않은 클러스터 된 인덱스를 도입하십시오. 그런 다음 SQL 대신 PK 대신 삽입 할 때이 인덱스를 사용하도록 설정합니까, 아니면 자동입니까? –

+1

+1은 별도의 클러스터 된 인덱스입니다. GUID를 클러스터 된 인덱스로 사용하지 마십시오. 성능이 저조합니다. –

+0

그냥 클러스터 된 인덱스에 사용할 수있는 GUID를 순차적으로 늘릴 수있는 새로운 newsequentialid() 기능을 사용할 수 있습니다 (Sql Server라고 가정). 무작위로 분산 된 데이터 (newid()의 클러스터 된 인덱스)는 임의의 위치에서 데이터가 다른 하드 드라이브에 기록되는 파티션을 사용하면 성능이 향상 될 수 있습니다. – sisve

2

데이터베이스가 중앙 집중화되지 않았거나 일부 컬렉션이 원격으로 수행되는 경우.

3

분산 데이터베이스가있는 응용 프로그램을 빌드 할 때 복합 기본 키와 분산 된 모든 데이터베이스의 데이터와 동기화되는 하나의 중앙 데이터베이스를 갖고 싶지 않으므로 GUID를 기본 키로 사용하고 있습니다. GUID를 사용하면 모든 DB에서 중앙 데이터베이스로 데이터를 가져올 때 충돌 (제약 조건 위반)이 발생하지 않습니다 (거의 *).

* 서로 다른 두 위치에서 동일한 GUID를 생성 할 가능성은 거의 없지만 불가능하지는 않습니다.

+1

GUID 충돌의 위험은 내가 취하려고합니다.) –

+0

예. 오해하지 마십시오. 이러한 일이 발생할 확률은 0이 아니지만 GUID는 이러한 종류의 사용에 매우 적합합니다. :-) – Petros

+0

GUID를 SQL Server의 CLUSTERED 인덱스로 사용하고 있지 않은지 확인하십시오. 그런 식으로는 끔찍한 것입니다. INT (IDENTITY) 또는 이와 유사한 것을 사용하십시오. 훨씬 좋습니다. –