문제

에서 상당히 애니메이션에서 토론 내 팀을 만들어 무엇을 생각하는 대부분의 사람들이 같은 기본 키가 있습니다.우리는 다음 그룹-

  1. Int/BigInt 는 자동 증가 충분히 좋은 기본 키가 있습니다.
  2. 이 있어야에서 3 개 이상의 열을 구성하는 기본 핵심이다.
  3. Id,GUID 및 인 읽을 수 있는 행 식별자는 모두 다르게 처리됩니다.

최상의 접근 방식은 무엇인가에 대한 PKs?응용 프로그램을 사용하는 경우 정당화 시킬 수 있습니다.더 나은 방법을까요?

편집:사람은 간단한 샘플/를 생성하는 알고리즘을 사람이 읽을 수 있는 식별자를 위한 행하는 것이?

도움이 되었습니까?

해결책

때때로 연결된 앱으로 데이터베이스간에 동기화를 수행하려면 기본 키에 Guids를 사용해야합니다. 디버깅에 대한 고통이 많으 므로이 경우를 제외하고는 자동화 된 INT를 고수하는 경향이 있습니다.

AutoinCrement ints는 기본값이어야합니다 ~ 아니다 그것들을 사용하는 것은 정당화되어야합니다.

다른 팁

나는 정말로 근본적인 요점을 지적하는 대답을 보지 못합니다. 데이터베이스에서 모델링). 이 관찰은 좋은 점과 기본 키에 대한 나쁜 선택을 확립하는 데 도움이됩니다.

예를 들어, (미국) 상태 이름 및 코드 표에서 이름 또는 코드가 기본 키가 될 수 있습니다. 두 개의 다른 후보 키를 구성하고 그 중 하나 (일반적으로 짧은 - 코드)가 선택됩니다. 기본 키. 기능적 종속성 이론에서 (그리고 종속성 조치 -1nf ~ 5NF- 이것은 기본 키가 아닌 중요한 후보 키입니다.

반례의 경우, 인간 이름은 일반적으로 기본 키를 위해 나쁜 선택을합니다. "존 스미스 (John Smith)"라는 이름이나 다른 유사한 이름으로가는 사람들이 많이 있습니다. 중간 이름을 고려하더라도 (기억하십시오 : 모든 사람이 하나가있는 것은 아닙니다 - 예를 들어, 그렇지 않습니다), 복제 범위가 충분합니다. 결과적으로 사람들은 이름을 기본 키로 사용하지 않습니다. 그들은 사회 보장 번호 (SSN) 또는 직원 번호와 같은 인공 키를 발명하여 개인을 지정하는 데 사용합니다.

이상적인 주요 키는 짧고 독특하며 기억에 남으며 자연 스럽습니다. 이러한 특성 중에서 독창성은 필수입니다. 나머지는 실제 데이터의 제약 조건을 감안할 때 유연해야합니다.

주어진 테이블의 기본 키를 결정할 때는 해당 테이블이 무엇을 나타내는 지 살펴 봐야합니다. 테이블의 어떤 열 값 세트 또는 열 값 세트는 테이블의 각 행을 고유하게 식별합니까? 그것들은 후보 열쇠입니다. 이제 각 후보 키가 4 개 또는 5 개의 열로 구성되어 있다면, 주로 기본 키를 만들기에는 너무 어색하다고 결정할 수 있습니다 (주로 부족함). 이러한 상황에서는 인위적으로 생성 된 숫자 인 대리 키를 소개 할 수 있습니다. 간단한 32 비트 정수는 대리 키에 충분합니다. 그런 다음이 대리 키를 기본 키로 지정합니다.

그러나 당신은 ~ 해야 하다 여전히 다른 후보 키 (대리 키는 후보 키와 선택한 기본 키라도)가 모두 고유 식별자로 유지되도록하십시오.

때때로 사람들은 행을 독특하게 만드는 것을 식별하기가 어렵다는 것을 알지만 정보를 반복하는 것이 더 이상 사실이되지 않기 때문에 그렇게해야 할 일이 있어야합니다. 조심하지 않고 동일한 정보를 저장하기 위해 2 개 (또는 그 이상) 행을 얻는다면 정보를 업데이트해야한다면 한 행만 업데이트 할 위험이 있습니다 (특히 커서를 사용하는 경우). 모든 행이 아니라 행은 동기화되지 않았으며 어떤 행에 올바른 정보가 포함되어 있는지 아무도 모릅니다.

이것은 어떤면에서 꽤 단단한 시야입니다.

필요할 때 안내서를 사용하는 데 특별한 문제가 없지만 (16-64 바이트에서와 같이) 너무 자주 사용됩니다. 아주 좋은 4 바이트 가치로 충분합니다. 4 바이트 값으로 인해 디스크 공간을 낭비하고 인덱스 페이지 당 값이 적기 때문에 데이터에 대한 인덱스 액세스가 느려지는 안내서를 사용하여 인덱스가 더 깊고 더 많은 페이지를 읽어야합니다. 정보.

사람들이 보편적 인 정답을 추구하기 때문에 이것은 종교적 문제 일뿐입니다. 팀과이 스레드가 너무 많은 의견 불일치를 보여주는 사실은 다른 상황에서 설명하는 모든 솔루션을 사용해야 할 충분한 이유가 있다는 단서가되어야합니다.

  • 대리 키는 표의 다른 속성이나 속성 세트가 적절하게 행을 식별하는 데 적합하지 않은 경우 유용합니다.
  • 가능한 경우 테이블을 인간으로 읽을 수 있도록 천연 키가 선호됩니다. 천연 키는 또한 종속 테이블의 외국 키가 대리 ID 대신 실제 값을 포함하도록 허용합니다. 예를 들어 보관해야 할 때 state (CA, TX, NY) char(2) int 대신 천연 키.
  • 적절한 경우 복합 기본 키를 사용하십시오. "추가하지 마십시오"id"완벽하게 좋은 화합물 키가 존재할 때 불필요하게 키를 대리하십시오 (이것은 특히 다수의 테이블에서 특히 그렇습니다). 모든 테이블의 3 열 키에 대한 의무는 절대적인 말도 안됩니다.
  • 지도는 여러 사이트에 대한 고유성을 보존해야 할 때 해결책입니다. 기본 키의 값이 고유하지만 순서가 없거나 연속되지 않으면 편리합니다.
  • int vs. bigint : 테이블이 일반적이지 않습니다. 필요합니다 기본 키를위한 64 비트 범위이지만 64 비트 하드웨어의 가용성이 높아짐에 따라 부담이되지 않아야하며 오버플로하지 않을 것이라는 확신을 줄 수 있습니다. int는 물론 더 작기 때문에 공간이 프리미엄이면 약간의 이점을 줄 수 있습니다.

좋아요 데이터베이스 프로그래머 블로그 이런 종류의 정보의 소스로.

기본 키를위한 3 개의 열? 비즈니스 규칙에 따라 열에 적절한 고유 한 제약이 있어야한다고 말하지만 여전히 별도의 대리 키가 있습니다. 복합 키는 비즈니스 로직이 키에 들어가는 것을 의미합니다. 로직이 변경되면 전체 스키마가 나사로 나옵니다.

나는 내 독특한 것을 좋아한다.

나는 항상 대리 키와 함께 간다. 대리 키 (일반적으로 ID 열, 자동화 또는 안내서)는 키가 데이터 자체에 존재하지 않는 것입니다. 반면에 자연스럽게 열쇠는 그 자체로 줄을 독특하게 식별하는 열쇠입니다. 내가 인생에서 알 수있는 한 거의 진짜 자연 키. 미국의 SSN과 같은 것조차도 자연스러운 열쇠는 아닙니다. 복합 기본 키는 재난이 일어나기를 기다리고 있습니다. 해당 데이터를 편집 할 수는 없지만 (자연 키의 주요 단점, 합성물이든 아니든) 복합 키를 사용하면 해당 키 데이터를 모든 관련 테이블에 영속해야한다는 것입니다. 얼마나 거대한 폐기물입니다.

이제 대리 키를 선택하기 위해 ID 열을 고수합니다 (주로 MS SQL Server에서 작업). Guid가 너무 크고 Microsoft는 권장합니다 에 맞서 그것들을 PK로 사용합니다. 여러 서버가있는 경우, 증분 10 또는 20 또는 동기화/확장해야 할 최대 수의 서버 수를 생각하면 각 후속 서버의 각 테이블에 대한 시드 만 그리고 데이터 충돌이 없을 것입니다.

물론, 증분으로 인해, 나는 Identity Column을 bigint로 만듭니다 (그렇지 않으면 긴 [64 비트]라고도 함).

약간의 수학을 수행하는 경우, 증분 100을 만들더라도 테이블에 여전히 92,233,720,368,547,758 (> 92 quantrillion) 행을 가질 수 있습니다.

"기본"이라는 문구에서 "1 차"라는 단어의 사용은 실질적인 의미이며 오해의 소지가 있다고 생각합니다.

먼저 "키"가 테이블 내에서 고유 해야하는 속성 또는 속성 세트라는 정의를 사용하십시오.

그런 다음 키를 갖는 것은 종종 상호 일관성이없는 목적을 제공합니다.

  1. 이 부모 테이블과 관계가있는 하위 테이블의 하나 이상의 레코드에 대한 조건으로 사용합니다. (그 어린이 테이블에서 외국 키를 명시 적으로 또는 암시 적으로 정의)
  2. (관련) 아동 레코드가 부모 탭에 부모 기록이 있어야하는지 확인;
  3. 테이블에서 특정 레코드/행을 빠르게 찾아야하는 쿼리의 PerforAmce를 늘리려면.

  4. 동일한 논리 엔티티가 테이블을 삽입하지 못하게하는 중복 행을 방지하여 데이터 일관성을 보장합니다. (이것은 종종 "자연적인"키라고하며, 비교적 변하지 않는 테이블 (엔티티) 속성으로 구성되어야합니다.)

분명히, 명백히, 부정전적이지 않은 비 자연적 키 (안내 또는 자동 생성 정수와 같은 것은 #4를 만족시킬 수 없습니다.

그러나 종종 대부분의 (대부분의) 테이블이있는 경우, #4를 제공 할 수있는 완전히 자연 키는 종종 여러 속성으로 구성되며 #1, #2 또는 #3을 사용하여 사용하여 용납 할 수 없을 정도로 넓거나 넓습니다. 성능 결과.

대답은 간단합니다. 둘 다 사용하십시오. 다른 하위 테이블의 모든 조인 및 FK에 대해 간단한 자동 생성 통합 키를 사용하지만 데이터 일관성이 필요한 모든 테이블 (테이블이 거의 없음)에 일관되지 않은 데이터 행의 삽입을 방지하는 대체 자연 고유 키가 있는지 확인하십시오. .. 또한, 당신이 항상 두 가지를 모두 가지고 있다면, 자연 키를 사용하는 것에 대한 모든 반대 의견 (변화한다면 어떻게해야합니까? 나는 모든 장소를 FK로 언급해야한다)는 그것을 사용하지 않기 때문에 무의미하게된다. .. 당신은 일관되지 않은 duplciate 데이터를 피하기 위해 PK 인 한 테이블에서만 사용하고 있습니다 ...

인덱스에 안내서를 사용하여 호스 인덱스 조각화를 할 수 있으므로 안내서를 사용하여 매우주의하십시오. 그것들을 생성하는 데 사용되는 가장 일반적인 알고리즘은 Guid의 "랜덤"부분을 가장 중요한 비트 위치에 넣습니다. 이는 새로운 행이 추가됨에 따라 일반 인덱스 해제 / 재인덱링의 요구 사항을 증가시킵니다.

약간 주제를 벗어나지 만, 나는 차임을 강요 당했다고 느낀다.

기본 키가 안내 인 경우 하지 마라 만들어주세요 클러스터 된 인덱스. 안내가 비 순위이기 때문에 거의 모든 삽입 중에 디스크에서 데이터가 다시 정리됩니다. (Yuck.) Guids를 기본 키로 사용하는 경우 클러스터되지 않은 인덱스 여야합니다.

당신이 결코해야 한지를 사용하 스마트 키를 누르십시오.가 어디에 대한 정보를 기록하는 코드에서 핵심 자체가,그것은 결국 물지 않습니다.

나는 일 중 하나는 곳,기본 키가 있었 계정 ID,는 문자와 숫자의 조합.내가 기억하지 않는 어떤 특성을,그러나,예를 들면,그 계정된 특정 유형의 것에 600 범위,및 다른 유형의 시작과 함께 400.는 큰,때까지 고객 요청하기로 결정한 두 종류의 작업이다.거나 변경된 작업의 유형은 그들이 했습니다.

다른 장소로 사용되는 위치에 있는 나무의 기본 키로 기록합니다.가 될 정도록 다음과 같습니다.

Cat1.subcatA.record1
Cat1.subcatA.record2
Cat1.subcatB.record1
Cat2.subcatA.record1

물론,첫번째 것은 고객이 원하는 이동하는 방식으로 항목을 나무에다.전체 소프트웨어 사망하기 전에는 일이 일어났습니다.

하시기 바랍는 경우에,당신은 코드를 작성하는가를 유지하시기 바랍를 사용하지 않는 똑똑한 열쇠입니다!

나는 자동 점수를 기본 키로 팬입니다. 나는 이것이 경찰이라는 것을 깊이 알고 있지만, 추가 될 때 데이터를 정렬 할 수 있습니다 (ID DESC, f'r 인스턴스).

3 개의 열은 인간적으로 구문 분석하기 위해 끔찍하게 들립니다.

그리고 그것은 상충 관계입니다. 관계형 능력의 양이 얼마나 필요한지, 여기 에서이 테이블을 인간이 심문하는 사람에게 이해할 수있게하는 것 (저장된 절차 또는 프로그래밍 인터페이스에 비해).

자동 점수는 우리 인간을위한 것입니다. :-(

일반적으로, 그것은 달라집니다.

개인적으로, 나는 Autoincrement Ints를 좋아합니다.

그러나 내가 말할 수있는 한 가지는 다른 소스의 데이터를 키로 절대 신뢰하지 않는 것입니다. 나는 내가 할 때마다 나를 물기 위해 돌아온다. 다시는 절대!

기본 키를 구성하는 3 개의 열이 있어야합니다.

나는 이것을 이해하지 못한다.

"자연 키", 예를 들어 "이름과 생년월일"에 대해 이야기하고 있습니까? 자연적인 키는 그것이 존재하는 경우 이상적 일 수 있지만, 대부분의 자연 키 후보는 독특하지 않거나 (같은 이름을 가진 몇몇 사람), 일정하지 않은 사람 (누군가 이름을 바꿀 수 있음).

int/ bigint aotoincrement가 충분한 기본 키입니다.

나는 Guid를 선호합니다. AutoinCrement의 잠재적 문제는 값 (예 : "주문 ID")이 데이터베이스 인스턴스 (예 : "판매 데이터베이스")에 의해 할당된다는 것입니다. 둘 이상의 데이터베이스 인스턴스 (예 : 자체 데이터베이스가있는 여러 영업 사무소의)로 생성 된 데이터를 병합해야합니다.

Re Guid 's

이것이 정말로 정말로 정말로 진짜 큰 데이터베이스, 많은 부하 및 빠른 액세스.

마지막 직장에서 우리는 1 억에서 5 억 ~ 5 억 레코드의 데이터베이스를 가지고 있는데, 데이터베이스 직원들은 Guids에 대해 강력하게 주장했으며 적절한 크기의 10 진수 수를 논쟁했습니다. 그들은 (Oracle에서) 문자열 안내에 대한 내부 스토리지의 크기 차이가 vs- 소수점 값은 조회에서 매우 눈에 띄는 차이를 만들 것이라고 생각했습니다. (더 큰 열쇠 = 가로에 더 깊은 나무)

GUID의 임의의 특성은 또한 인덱스 페이지의 필수 인자를 크게 줄입니다. 이는 눈물과 디스크 I/O를 극적으로 증가시킵니다.

자동 증분 열. SQL Server 또는 Oracle을 사용하여 코드를 원활하게 작동시킬 수 있습니다. 하나는 DAL을 통해 시퀀스를 사용하여 ID를 사용하여 ID를 사용하여 더 행복 할 수 없었습니다. 나는 당신이 복제를 수행하거나 나중에 데이터를 보내기 위해 데이터를 보내는 경우에도 도이드가 필요하다는 데 동의합니다.

나는 항상 'ID'라는 자동화 된 정수 인 대리 키를 사용했습니다. 다른 옵션이 명백한 경우 에도이 작업을 수행해야 할 많은 이유를 볼 수 있습니다.

  • 일관성
  • 데이터 독립 (독특한, 형식 변경에 의해 파괴되지 않음)
  • 인간이 읽을 수 있습니다

... 그리고 합리적인 이유는 없다 :

  • 결합의 모호성? - 별명 테이블이 더 나은 연습입니다, IMHO
  • 최적의 테이블? - 항목 당 하나의 바이트를 제거하는 것은 조기 최적화입니다, IMHO
  • 테이블 당 결정? - 더 이상 일관되지 않습니다
  • 스케일링 문제? - 어? 왜요?
  • 계층 적 데이터 구조? - 그것은 종교의 다른 주제 인 비정상화입니다. 이론적으로 몇 가지 상황에서 팬이지만 실제로는 결코 팬이라고 말하면 충분합니다.

내가 생각하지 않았거나 아직 오지 않은 것에 대한 현명한 이유는 항상 환영받습니다 ...

이것은 고전적인 "It depends"입니다. 모든 프로젝트에 대한 정답은 없습니다. 나는 다른 상황에서 다른 것을 좋아합니다. 그것은 내가 ORM을 사용하는지 여부와 그것이 지원하는 것에 달려 있습니다. 전체 아키텍처 (배포 여부 등)에 따라 다릅니다. 당신이 생각하는 것을 선택하고 탭과 공간을 논쟁하는 것으로 넘어갑니다.

크기, 연결하는 사람의 수 및 여러 데이터베이스 서버 상황인지 여부에 따라 옵션 #1 또는 #3을 사용하는 경향이 있습니다.

옵션 #2는 나에게별로 의미가 없습니다. 세 가지 중 하나가 고유 한 레코드를 식별하기에 충분하지 않으면 (추가 가공을 통과하지 않고) 두 개의 레코드가 세 열 모두에서 동일한 값으로 표시 될 수 있습니다. 세 가지의 조합에 대해 독창성을 시행하려면 인덱스를 추가하십시오.

나는 자동 점수 int 또는 Guid 만 사용합니다. Auto-Increment int를 사용하는 시간의 99%. 데이터베이스에 대해 처음 알게되었을 때 사용하도록 가르쳐 준 것입니다. 데이터베이스에 대해 사용하지 않는 이유는 없었습니다 (유령이 더 나은 이유를 알고 있지만).

가독성에 도움이되기 때문에 자동 증분 int를 좋아합니다. 예를 들어 "레코드 129383을 살펴보십시오"라고 말할 수 있으며 누군가가 들어가서 찾기가 매우 쉽습니다. 거의 불가능한 안내서와 함께.

기본 정의 답변을 지나서, 무엇을 구성 하는가 좋은 주요 키는 주로 종교와 방송실 논쟁에 남겨진다. 당신이 항상 개별 행에 독특하게 매핑하는 것이 있다면, 그것은 기본 키로 잘 작동합니다. 그 시점을 지나서 다른 고려 사항이 있습니다.

  • 기본 키 정의가 지나치게 복잡하지 않습니까? "베스트 홍보"를 따르는 것을 위해 불필요한 복잡성을 도입하지 않습니까?
  • 데이터베이스가 처리하려면 (예 : 정수 대 Varchar 등) 오버 헤드가 덜 필요한 더 나은 기본 키가 있습니까?
  • 기본 키의 독창성과 정의 된 불변의 불변이 변하지 않을 것이라고 확신합니까?

이 마지막 것은 주소, 전화 번호, 이름/성 등과 같은 것들에 의존하기 때문에 대부분의 사람들이 안내 또는 자체 확보 정수 열과 같은 것을 사용하도록 끌어들이는 것일 수 있습니다. 내가 생각할 수있는 사람들에 대한 유일한 불변은 SSN이지만, 영원히 고유 한 사람들에 대해서는 100% 확실하지 않습니다.

바라건대 이것은 명확성을 더하는 데 도움이되기를 바랍니다 ...

내가 기본 키에 접근하는 방식 (그리고 최고라고 생각합니다)은 "기본"접근 방식을 피하는 것입니다. 이것은 단지 자동 침입 정수를 때리고 날이라고 부르는 대신 문제를보고 "항상 qiiue이고 변경되지 않는 열의 열이나 열이 있습니까?"라고 말합니다. 대답이 예라면 그 접근 방식을 취합니다.

거의 항상 정수.

그들은 처리하기에 더 작거나 빠르는 것 외에 다른 이유가 있습니다. "404040"또는 "3463B5A2-A02B-4FD4-AA0F-1D3C0450026C"는 무엇입니까?

약간 관련성이 있지만 작은 분류 테이블 (본질적으로 코드에서 열거를 나타내는 것)을 가지고있을 때 최근에 시작한 한 가지는 기본 키를 Char (3) 또는 char (4)로 만들 것입니다. 그런 다음 기본 키를 조회 값을 대표합니다.

예를 들어, 내부 판매 에이전트에 대한 인용 시스템이 있습니다. 우리는 모든 견적 라인 항목 중 하나가 할당 된 "비용 카테고리"가 있습니다. 'ODC'. 조회 테이블의 다른 열은 코드의 일반적인 영어 의미, "자료", "서비스", "여행", "세금", "기타 직접 비용"등과 같은 자세한 내용을 저장합니다.

이것은 int보다 더 이상 공간을 사용하지 않기 때문에 정말 좋습니다. 소스 데이터를 살펴보면 값이 무엇인지 알기 위해 조회 테이블을 연결할 필요가 없습니다. 예를 들어, 견적 행은 다음과 같습니다.

1 파트너 $ 40 MTL
2 기타 단위 $ 29.99 SVC
3 PARTNUMBER2 $ 150 TRV

int를 사용하여 범주를 나타내고 모든 줄에 1, 2, 3을 연결하는 것이 훨씬 쉽습니다. 바로 앞에 데이터가 있으며 성능은 전혀 영향을받지 않는 것 같습니다 (I가 아닙니다. 진정으로 테스트했습니다.)

진짜 질문이가는 한 ... 나는 Rowguid SightIndifiers를 좋아합니다. 나는 이것에 대해 100%가 아니지만, 모든 행은 어쨌든 내부 로우 지드를 가지고 있지 않습니까? 그렇다면 Rowguid를 사용하면 실제로 ints (또는 그 문제에 대한 다른 항목)보다 공간이 적습니다. 내가 아는 것은 M $가 GreatPlains에서 사용하기에 충분하다면 나에게 충분하다는 것입니다. (내가 오리야하나요 ??)

오, 내가 안내서를 사용하는 한 가지 이유 - 계층 적 데이터 구조를 사용합니다. 즉, 기본 키가 일치하는 테이블 '회사'와 '공급 업체'가 있습니다. 그러나 회사에서 '상속'도 '제조업체'를 가지고 있습니다. 공급 업체 및 제조업체에 공통적 인 분야는 해당 테이블에 나타나지 않습니다. 회사에 나타납니다. 이 설정에서 INT를 사용하는 것은 안내보다 훨씬 고통 스럽습니다. 최소한 ID 기본 키를 사용할 수 없습니다.

나는 천연 열쇠를 좋아합니다. 신뢰할 수 있습니다. 주제 전문가에게 이해하는 키를 사용하기 위해 소규모 성능 가격을 지불 할 의향이 있습니다.

엔티티를 설명하는 테이블의 경우, 사람들이하는 주제와 같은 방식으로 개별 사례를 식별하는 간단한 자연 키가 있어야합니다. 주제에 엔티티 중 하나에 대한 신뢰할 수있는 식별자가 없으면 대리 키에 의존하겠습니다.

관계를 설명하는 테이블의 경우, 각 구성 요소는 관계에 참여하는 엔터티를 참조하고 엔티티 테이블의 행을 참조합니다. 다시 말하지만, 컴파운드 키 사용에 대한 성능은 일반적으로 최소화됩니다.

다른 사람들이 지적했듯이, "기본 키"라는 용어는 약간 오해의 소지가 있습니다. 관계형 데이터 모델에서 사용되는 용어는 "후보 키"입니다. 단일 테이블에는 여러 후보 키가있을 수 있습니다. 논리적으로, 각각은 다른 것만 큼 좋습니다. 그들 중 하나를 "기본"으로 선택하고 해당 키를 통해 모든 참조를하는 것은 단순히 디자이너가 만들 수있는 선택입니다.

Guids.Period.

스케일을 확장해야하거나 대체로 기본 키를 할당 해야하는 경우 친구가 될 것입니다. 다른 모든 것에 대한 색인을 추가 할 수 있습니다.


내 진술을 명확히하기 위해 업데이트.

나는 여러 종류의 사이트에서 일했습니다. 작은 단일 서버에서 다중 DB 및 웹 서버로 뒷받침되는 대형 서버에 이르기까지. ints를 기본 키로 자동 증분하는 데는 괜찮을 앱이 확실히있었습니다. 그러나 그것들은 내가하는 일의 모델에 맞지 않습니다.

안내서를 사용하면 어디서나 ID를 생성 할 수 있습니다. 원격 서버, 웹 앱, 데이터베이스 자체 내에서 또는 멀티 마스터 상황의 여러 데이터베이스 내에서 생성 할 수 있습니다.

반면에, 자동 증분 INT는 기본 데이터베이스 내에서만 안전하게 생성 될 수 있습니다. 다시, 이것은 ~할 것 같다 DB 서버를 뒷받침하는 응용 프로그램이 있으면 DB 서버를 뒷받침하는 응용 프로그램이 있으면 스케일링이 관심이있는 것이 아닙니다.

물론, 안내서의 사용은 야간에 다시 구한 프로세스를 가져야한다는 것을 의미합니다. 그러나 자동 증분 int 이외의 것을 사용하는 경우 어쨌든 그렇게해야합니다. INT를 기본으로하더라도 단편화를 처리하기 위해 재생 해야하는 다른 색인이있을 수 있습니다. 따라서 Guids를 사용한다고해서 해당 작업을 수행해야하기 때문에 다른 문제를 정확하게 추가하지는 않습니다.

더 큰 앱을 살펴보면 중요한 것을 알게 될 것입니다. 모두 Base64 인코딩 된 안내서를 키로 사용합니다. 그 이유는 간단하기 때문에 Guids를 사용하면 확장 할 수 있습니다. 밖으로 쉽게 INT를 확장하려고 할 때 많은 후프가있을 수 있습니다.

우리의 최신 앱은 약 한 달 동안 지속되는 무거운 인서트 기간을 거칩니다. 그 후 쿼리의 90+%가 모두보고를 선택합니다. 용량을 높이기 위해이 대규모 삽입 기간 동안 추가 DB 서버를 제기 할 수 있습니다. 나중에보고를 위해 단일 DB로 쉽게 병합합니다. ints와 함께 시도하는 것은 절대적인 악몽 일 것입니다.

솔직히 말해서, 데이터베이스 또는 설정 복제를 클러스터링 할 때마다 DB 서버는 어쨌든 테이블에 안내가 있어야합니다. 따라서 시스템이 성장해야한다고 생각하면 좋은 시스템을 선택하십시오.

이것은 당신이 그것을 깨달았는지 여부에 관계없이 복잡한 주제입니다. 이 stackoverflow faq의 섹션에 속할 수 있습니다.

여기서 어떤 질문을해야합니까?

주관적이거나 논쟁 적이거나 확장 된 토론이 필요한 질문을 피하십시오. 이곳은 대답 할 수있는 질문을위한 장소입니다!

이것은 몇 년 동안 논의되어 왔으며 몇 년 동안 계속 논의 될 것입니다. 내가 본 합의의 유일한 힌트는 당신이 OO 남자를 요구하는지에 따라 대답이 다소 예측 가능하다는 것입니다 (안내서는 유일한 방법입니다!), 데이터 모델러 (자연 키가 유일한 방법입니다!),, 또는 성능 지향 DBA (INT는 유일한 방법입니다!).

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