[algorithm] 기본 키가 마음에 드십니까? [닫은]

우리 팀의 상당히 활발한 토론에서 나는 대부분의 사람들이 기본 키로 좋아하는 것을 생각하도록 만들어졌습니다. 우리는 다음 그룹을 가졌습니다.

  1. 자동 증가가 충분한 기본 키인 Int / BigInt.
  2. 기본 키를 구성하는 열이 3 개 이상 있어야합니다.
  3. ID, GUID 및 사람이 읽을 수있는 행 식별자는 모두 다르게 처리되어야합니다.

PK에 대한 최선의 접근 방식은 무엇입니까? 당신의 의견을 정당화 할 수 있다면 멋질 것입니다. 위의 방법보다 더 나은 방법이 있습니까?

편집 : 누구나 잘 확장되는 행에 대해 사람이 읽을 수있는 식별자를 생성하는 간단한 샘플 / 알고리즘이 있습니까?



답변

가끔 연결되는 앱을 사용하여 데이터베이스간에 동기화를 수행하려는 경우 기본 키에 GUID를 사용해야합니다. 디버깅에는 일종의 고통이므로 그 경우를 제외하고는 자동 증가를 사용하는 int를 고수하는 경향이 있습니다.

Autoincrement int는 기본값 이어야하며 사용 하지 않는 것이 정당해야합니다.


답변

나는 정말로 근본적인 요점 (내가 생각하는 것)을 지적하는 대답을 보지 못했다. 데이터베이스에서 모델링 됨). 이 관찰은 기본 키에 대해 좋은 것과 나쁜 선택을 설정하는 데 도움이됩니다.

예를 들어, (미국) 주 이름 및 코드 테이블에서 이름 또는 코드는 기본 키가 될 수 있습니다. 두 개의 서로 다른 후보 키를 구성하고 그중 하나 (일반적으로 더 짧은 코드)가 기본 키. 기능적 종속성 (및 조인 종속성 (1NF ~ 5NF)의 이론에서 기본 키가 아니라 중요한 후보 키입니다.

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

이상적인 기본 키는 짧고 독특하고 기억에 남는 자연스러운 것입니다. 이러한 특성 중 고유성은 필수입니다. 나머지는 실제 데이터의 제약 조건에 따라 유연해야합니다.

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

그러나 다른 후보 키 (대리 키도 후보 키일뿐만 아니라 선택한 기본 키인 경우)가 모두 고유 식별자로 유지되는지 확인 해야합니다. 일반적으로 해당 열 집합에 고유 제약 조건을 적용합니다.

때때로 사람들은 행을 고유하게 만드는 것이 무엇인지 식별하기가 어렵지만 그렇게해야 할 일이 있어야합니다. 단순히 정보를 반복한다고해서 더 이상 사실이되는 것은 아니기 때문입니다. 주의하지 않고 동일한 정보를 저장하는 행이 두 개 (또는 그 이상) 인 경우 정보를 업데이트해야하는 경우 한 행만 업데이트 할 위험이 있습니다 (특히 커서를 사용하는 경우). 모든 행이 아니라 행이 동기화되지 않았고 어느 행에 올바른 정보가 있는지 아무도 모릅니다.

이것은 어떤면에서 꽤 강경 한 견해입니다.

GUID가 필요할 때 사용하는 데 특별한 문제는 없지만, 크기 경향이 있고 (16-64 바이트) 너무 자주 사용됩니다. 아주 자주 완벽하게 좋은 4 바이트 값으로 충분합니다. 4 바이트 값으로 충분한 GUID를 사용하면 디스크 공간이 낭비되고 인덱스 페이지 당 값이 적기 때문에 데이터에 대한 인덱스 액세스 속도도 느려집니다. 따라서 인덱스는 더 깊어지고 더 많은 페이지를 읽어야합니다. 정보.


답변

사람들이 보편적 인 정답을 추구하기 때문에 이것은 종교적인 문제 일뿐입니다. 귀하의 팀과이 SO 스레드 모두 서로 다른 상황에서 설명하는 모든 솔루션을 사용해야하는 좋은 이유가 있다는 단서가되어야합니다.

  • 서로 게이트 키는 테이블의 다른 속성이나 속성 집합이 행을 고유하게 식별하는 데 적합하지 않을 때 유용합니다.
  • 가능한 경우 테이블을 사람이 더 쉽게 읽을 수 있도록 자연 키를 사용하는 것이 좋습니다. 또한 자연 키를 사용하면 종속 테이블의 외래 키가 대리 ID 대신 실제 값을 포함 할 수 있습니다. 예를 들어 state(CA, TX, NY) 를 저장해야 할 때 char(2)int 대신 자연 키를 사용할 수도 있습니다 .
  • 적절한 경우 복합 기본 키를 사용하십시오. id완벽하게 좋은 복합 키가있을 때 불필요하게 ” “대리 키를 추가하지 마십시오 (특히 다 대다 테이블에서 해당됨). 모든 테이블에서 3 열 키에 대한 명령은 절대적으로 말도 안됩니다.
  • GUID는 여러 사이트에서 고유성을 유지해야하는 경우 솔루션입니다. 기본 키의 값이 고유하지만 순서가 없거나 연속적이지 않은 경우에도 유용합니다.
  • INT 대 BIGINT : 테이블 에 기본 키에 대해 64 비트 범위 가 필요한 것은 일반적이지 않지만 64 비트 하드웨어의 가용성이 증가함에 따라 부담이되지 않으며 오버플로가 발생하지 않을 것이라는 더 많은 보증을 제공합니다. INT는 물론 더 작기 때문에 공간이 부족하면 약간의 이점을 줄 수 있습니다.


답변

나는 이런 종류의 정보에 대한 소스로 데이터베이스 프로그래머 블로그 를 좋아 합니다.

기본 키에 대한 열 3 개? 열에는 비즈니스 규칙이 요구하는대로 적절한 고유 제약 조건이 있어야하지만 여전히 별도의 대리 키가 있습니다. 복합 키는 비즈니스 로직이 키에 입력됨을 의미합니다. 논리가 변경되면 전체 스키마가 망가집니다.


답변

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


답변

약간 주제에서 벗어 났지만, 차임에 차를 몰고 가야한다고 느낍니다 …

기본 키가 GUID 인 경우 클러스터형 인덱스로 만들지 마십시오 . GUID는 비 순차적이므로 거의 모든 삽입 중에 데이터가 디스크에 다시 정렬됩니다. (네.) GUID를 기본 키로 사용하는 경우 클러스터되지 않은 인덱스 여야합니다.


답변

나는 항상 대리 키를 가지고 간다. 서로 게이트 키 (일반적으로 ID 열, 자동 증가 또는 GUID)는 데이터 자체에 키가없는 키입니다. 반면에 자연 키는 자체적으로 행을 고유하게 식별하는 키입니다. 내가 인생에서 말할 수있는 한, 실제 자연적인 열쇠 는 거의 없습니다 . 미국의 사회 보장 번호 (SSN) 같은 것조차 자연스러운 열쇠는 아닙니다. 복합 기본 키는 발생하기를 기다리는 재난입니다. 해당 데이터를 편집 할 수는 없지만 (복합 여부에 관계없이 모든 자연 키의 주요 단점), 더 나쁜 것은 복합 키를 사용하는 경우 이제 해당 키 데이터를 모든 관련 테이블에 영속화해야한다는 것입니다. 엄청난 낭비입니다.

이제 대리 키를 선택하기 위해 ID 열을 사용합니다 (대부분 MS SQL Server에서 작업 함). GUID의 너무 큰 마이크로 소프트는 권고 에 대해 PK로를 사용하여. 서버가 여러 개인 경우 10 또는 20을 늘리거나 동기화 / 확장해야하는 최대 서버 수를 늘리고 각 후속 서버의 각 테이블에 대한 시드를 추가하기 만하면됩니다. , 데이터 충돌이 발생하지 않습니다.

물론 증분 때문에 식별 열을 BigInt (또는 long [64 비트]라고 함)로 만듭니다.

약간의 수학을 수행하면 100 씩 증가하더라도 테이블에 92,233,720,368,547,758 (> 92 조) 행이있을 수 있습니다.