2010-12-29 2 views
10

정수를 내 테이블의 기본 키로 사용하지 않아야하는 이유가 있습니까?SQL 기본 키, INT 또는 GUID 또는 ..?

데이터베이스는 SQL-CE이며 연간 약 50,000 개의 항목이있는 두 개의 주 테이블과 몇 개의 보조 테이블이 있습니다. 데이터베이스에 항상 열려있는 두 개의 연결 만 존재합니다. 그러나 업데이트는 여러 개의 TCP 소켓 연결을 통해 트리거되므로 동일한 데이터베이스 연결에 액세스하여이를 사용하는 많은 크로스 스레드가됩니다. 활동량이 매우 적기 때문에 동시 업데이트는 거의 불가능하지만 일일 최대 두 번 발생할 수 있습니다.

DAL 또는 입력 된 데이터 집합에 LINQ2SQL을 사용합니다. 이 적은 메모리, 낮은 IO를 의미 작 -이 정보는 관련이 있지만, 내가 부탁 해요 내가 왜 :) 모르는

+0

다음과 같은 인기있는 질문에서 유용한 정보를 얻을 수 있습니다. [기본 키는 어떻습니까?] (http://stackoverflow.com/questions/404040/how-do-you-like-your-primary -keys) [MS SQL의 기본 키로 GUID를 사용하는 것은 좋지 않은 생각입니까?] (http://stackoverflow.com/questions/537145/is-it-a-bad-ide-to-use-guids-as) -primary-keys-in-ms-sql) – DOK

답변

9

GUID 기본 키를 사용하면 데이터가 한 데이터베이스에서 다른 데이터베이스로 데이터를 이동할지 여부와 같이 전 세계에서 고유해야한다는 장점이 있습니다. 행이 고유하다는 것을 알았습니다.

하지만 우리가 작은 데이터베이스에 대해 말하면 정수를 선호합니다.

편집 :

SQL Server 2005를 ++ 사용하는 경우, 당신은이 위의 행을 기반으로 GUID를 생성 NEWSEQUENTIALID(), 사용할 수 있습니다.newid()가 더 이상 존재하지 않는 인덱스 문제를 허용합니다.

+0

클러스터 된 인덱스를 사용하는 경우 색인 생성 문제를 완전히 해결하지 못합니다. 성능 문제 (그리고 PK를 사용하는 모든 인덱스에 대해 더 큰 저장 공간 크기)를 갖는 인덱스는 int와 비교할 때 훨씬 넓어 지므로 인덱스를 생성 할 수 있습니다. 그렇다면 GUID 만 사용하는 것이 가장 좋습니다. 미래에 또는 복제를 사용하는 경우 다른 데이터베이스로 데이터를 이동해야합니다. – HLGEM

+0

4 바이트 대 16 바이트가 있습니다 ... 1 백만 레코드는 11MB를 약간 웃도는 것입니다 – sv88erik

+0

고마워요! 고유 한 GUID의 목적을 알지 못했지만 의미가 있으며 따라서 걱정할 필요가 없습니다. 내 컴퓨터에서 이동하지 않습니다 :) – bretddog

10

당신은 정수를 사용해야하기 때문에 즉, 만약

확실하지 않음 (디스크 및 네트워크)에 대한 참여가 적습니다.

데이터베이스는 PK 유형에 관계없이 동시성 문제를 처리해야합니다.

+0

"적은 작업 2에 참여", 무엇을 넣었습니까? 귀하 또는 SQL Server의 경우? 하드 코드 월요일에 가입 링크가 있습니까? – sv88erik

+3

@ sv88erik - 서버에 대한 작업량이 적습니다. – Oded

5

내가 내 테이블에 대한 기본 키 정수를 사용해서는 안 어떤 이유가 있습니까?

아니요, 각 하나가 고유 한 경우 정수는 괜찮습니다. 처음에는 귀뚜라미가 좋은 생각처럼 들리지만 실제로는 너무 큽니다. 대부분의 경우 파리를 죽이기 위해 슬레지 해머를 사용하고 있으며 Guid의 크기는 정수를 사용하는 것보다 훨씬 느립니다.

+2

guid의 make 데이터베이스가 훨씬 느린 진술에 대한 증거를 제공 할 수 있습니까? –

3

확실히 정수를 사용하면 클러스터 된 인덱스 (PK)에서 GUID를 사용하지 않으므로 테이블이 불필요하게 조각화됩니다.

+2

PKs가 클러스터 된 인덱스 일 필요는 없습니다. – HLGEM

5

이 시나리오에서는 자동 증가 정수를 사용하지 않아도됩니다. 정수가 데이터 양을 처리 할 수없는 지점에 도달했다면 어쨌든 더 많은 작업이 포함되는 지점까지 확장 된 응용 프로그램에 대해 이야기하고있는 것입니다.

  1. 정수는 하드웨어의 기본 단어 크기 :

    염두에두고 몇 가지를 유지합니다. 데이터 유형에 따라 컴퓨터에서 빠르고 쉽습니다.

  2. GUID를 사용하는 것을 고려할 때 끔찍한 기본 키를 생성한다는 사실을 알고 있어야합니다. 관계형 데이터베이스는 일반적으로 (모든 것을 말할 수는 없지만 MS SQL은 좋은 예입니다) GUID를 잘 인덱싱하지 않습니다. 더 많은 인덱스 친화적 인 GUID를 만들고, 가져 가거나, 남겨두기 위해 해킹이 있습니다. 그러나 일반적으로 GUID는 성능상의 이유로 PK로 피해야합니다.
+2

항상 Microsoft에서 GUID를 기본 키로 사용하고 있기 때문에 재미 있습니다. 예를 들어 Microsoft CRM은 GUID를 기본 키로 사용합니다. GUID의 한 가지 이점은 시퀀싱에 대해 걱정할 필요가 없으며 이전 키를 어떻게 든 다시 사용하지 않는 한 키 위반을받을 수 없다는 것입니다. –

+1

@Mystere Man : 글쎄, 중요한 위반 사항을 얻지는 못했을 것이다 :) 그러나 당신의 요점은 여전히 ​​남아 있으며, 나는 마이크로 소프트의 툴에 대해 결코 이해하지 못했던 것입니다. ASP .NET에 대한 그들의 멤버쉽/역할 제공자는 공통적 인 예입니다. 그런 것이 문제가되지 않는 작은 프로젝트에서는 잘 작동하지만 확장되지는 않습니다. – David

관련 문제