문제

다음의 예를보고 싶습니다.

  • 이것이 적절할 때
  • 이것이 적절하지 않은 경우

데이터베이스의 선택이 위의 예를 변화시킬 때가 있습니까?

도움이 되었습니까?

해결책

이것은 실제로 질문 인 것 같습니다 대리 키는 항상 자동 증가 번호 또는 안내서이므로 단일 열 Vs입니다. 자연스러운 진정으로 독특하기 위해 종종 여러 정보가 필요한 키. 당신이 하나의 열만 인 자연스러운 키를 가질 수 있다면, 어쨌든 요점은 분명히 멍청합니다.

어떤 사람들은 하나 또는 다른 사람들 만 사용한다고 주장합니다. 프로덕션 데이터베이스를 사용하여 충분한 시간을 보내면 상황에 독립적 인 모범 사례가 없다는 것을 알게됩니다.

이러한 답변 중 일부는 SQL Server 용어를 사용하지만 개념은 일반적으로 모든 DBMS 제품에 적용됩니다.


단일 열 대리 키를 사용하는 이유 :

  • 클러스터 된 인덱스. 클러스터 된 인덱스는 데이터베이스가 단순히 추가 할 수있을 때 항상 가장 잘 수행됩니다. 그렇지 않으면 DB가 수행해야합니다. 페이지 분할. 키가있는 경우에만 적용됩니다 잇달아 일어나는, 즉, 자동 증가 시퀀스 또는 순차적 인 Guid. 임의의 가이드는 아마도 성능에 훨씬 더 나빠질 것입니다.

  • 관계. 캐릭터 유형 및 기타 비 컴팩스 데이터를 포함하여 키가 3, 4, 5 열 길이라면 결국 낭비됩니다. 막대한 20 개의 다른 테이블 에서이 키에 대한 외국 키 관계를 만들어야하는 경우 공간의 양과 성능을 줄입니다.

  • 독창성. 때때로 당신은 그렇지 않습니다 가지다 진정한 자연 키. 어쩌면 당신의 테이블은 일종의 로그 일 수 있으며, 동시에 같은 이벤트를 동시에 얻을 수 있습니다. 아니면 당신의 실제 키는 결정할 수있는 구체화 된 경로와 같은 것일 수 있습니다. ~ 후에 행은 이미 삽입되었습니다. 어느 쪽이든, 당신은 항상 클러스터 된 인덱스 및/또는 기본 키가 고유하기를 원하므로 다른 고유 한 정보가 없다면 대리 키를 사용하는 것 외에는 선택의 여지가 없습니다.

  • 호환성. 대부분의 사람들은 이것을 다룰 필요가 없지만 자연 키에 hierarchyid, 일부 시스템은 읽을 수 없을 수도 있습니다. 이 경우 다시 당신 ~ 해야 하다 이러한 응용 프로그램에서 사용할 간단한 자동 생성 대리 키를 만듭니다. 자연 키에 "이상한"데이터가 없더라도 일부 DB 라이브러리는 다중 열 기본 키를 다루는 데 많은 어려움이 있지만이 문제는 빠르게 사라지고 있습니다.

다중 열 자연 키를 사용해야하는 이유

  • 저장. 데이터베이스를 사용하는 많은 사람들은이 요소를 신경 쓰기에 충분히 큰 사람들과 함께 작동하지 않습니다. 그러나 테이블에 수십억 또는 수조 행이 있으면이 테이블에서 최소 최소의 데이터를 유지하고 싶을 것입니다.

  • 복제. 예, 안내 또는 순차적 인 Guid를 사용할 수 있습니다. 그러나 Guid에는 자체 트레이드 오프가 있으며, 어떤 이유로 Guid를 사용할 수 없거나 원하지 않는다면 다중 열 자연 키는 복제 시나리오에 훨씬 더 나은 선택입니다. 본질적으로 전 세계적으로 독특합니다 - 즉, 독특하게 만들기 위해 특별한 알고리즘이 필요하지 않습니다. 독특합니다. 정의에 따라. 이것은 분산 아키텍처에 대해 매우 쉽게 추론 할 수있게합니다.

  • 성능을 삽입/업데이트하십시오. 대리 키는 무료가 아닙니다. 고유 한 열 세트가있는 경우 그리고 자주 쿼리 하므로이 열에 덮개 인덱스를 만들어야합니다. 인덱스는 테이블만큼 큰 공간을 낭비합니다. 그리고 수정할 때마다 두 번째 색인을 업데이트해야합니다. 만 가질 수 있다면 하나 테이블에서 인덱스 (클러스터 인덱스)를 사용해야합니다!


그것이 바로 박쥐에서 떠오르는 것입니다. 갑자기 다른 것을 기억하면 업데이트하겠습니다.

다른 팁

기본 키를 자동 생성 키로 만들고 여러 열에 고유 한 제약 조건과 색인을 생성하는 것이 거의 항상 (적어도 응용 프로그램 개발자 관점에서) 거의 항상 더 좋습니다.

  • 단일 자동 생성 기본 키를 사용하면 다른 테이블 에서이 테이블에 대한 참조를 쉽게 추가 할 수 있습니다.
  • 자동 생성 된 기본 키는 ORM 라이브러리에서 더 간단하게 작동합니다.
  • 또한 미래에 독창성 제약이 변경되면 기존 기본 키를 변경할 필요가 없습니다.

DBA는 다중 열 기본 키가 항상 충분하다고 생각했고, 향후 요구 사항 변경이이를 잘못 입증했기 때문에 여러 두통을 유발하는 상황이 발생합니다.

당신은 거의 항상 기본 키를 원하기 때문에 기존 두 열을 기본 키로 선택하거나 새로운 자동 증가 PK를 만들고 대신 두 열에 일반적인 고유 한 제약을하는 것 사이의 선택이라고 가정합니다.

2 열 기본 키를 원할 때 :

  • 두 개의 다른 테이블을 참조하는 중간 테이블이있는 경우 두 개의 외래 키로 만 구성됩니다. 이미 가지고있는 두 열을 기본 키로 사용하십시오.

자동 점수 기본 키를 원할 때 :

  • 다른 테이블에서 테이블을 참조하는 경우, 대상 테이블의 기본 키가 작아지기를 원합니다. 해당 데이터는 참조 테이블의 외래 키로 반복되기 때문입니다. 당신은 또한 그것이 빠르게 비교하기를 원합니다.
  • 테이블에 추가 한 모든 색인에는 클러스터링 키 사본 (일반적으로 기본 키와 동일)이 포함됩니다. 클러스터링 키가 필요한 것보다 크면 해당 테이블의 모든 색인이 필요한 것보다 클 것입니다.

몇 가지 예 ...

적절한:

  • OLTP 시스템, 대부분의 상황에서 대부분의 다수의 관계를 구현할 때.

부적절한 :

  • OLAP 시스템의 치수 테이블의 경우 - 팩트 테이블을 최대한 작고 빠르게 할 수 있도록 치수 키를 최대한 작게 만들려고합니다.

  • 조합이 고유한지 확실하지 않은 경우. 이것은 꽤 어리석은 예이지만 "사람"테이블은 다중 열 PK에게는 나쁜 선택이 될 것입니다.

적절한시기의 한 가지 예는 다른 테이블을 연결하는 외래 키 필드가있는 링크 테이블이있을 때입니다.

일반적으로 기존을 사용하여 필드를 가능한 경우 기본 키로 식별하는 것이 좋습니다. 자연스러운 ID 필드가없고 고유 한 PK를 얻기 위해 많은 필드를 결합해야한다면 자동 번호를 사용하는 것이 좋습니다. 필드가 2 개 이상인 기본 키는 지저분해질 수 있습니다.

멀티 컬럼 인덱스와 키를 사용했을 때 응용 프로그램에서 성능이 큰 성능이 향상되었습니다. 그것은 우리가 가장 일반적인 쿼리에서 인덱스를 만들 수 있었고 전체 select 절이 인덱스에있을 수 있으므로 메인 테이블에 액세스하지 못했습니다. 그러나 앱과 데이터 세트에 따라 다릅니다.

때때로 복합 자연 키는 직관적 인 의미가 있습니다. 예를 들어, 회사의 일부 세부 사항이있는 회사 (PK는 Comapnyid)를위한 테이블이 있다고 가정합니다. 또한 역사적으로 회사의 CEO 이름을 저장해야합니다. 자연의 불변은 한 회사가 한 번에 한 CEO 만 가질 수 있다는 것입니다. 그런 다음 CompanyID의 복합 PK (Company in CompanyID) +에서 CompanyCEO 테이블을 만드는 것이 직관적입니다. 해당 테이블의 다른 열은 Todate 및 Ceoname 일 수 있습니다. 이렇게하면 한 명의 CEO 만 특정 날짜에 시작할 수 있음을 보장 할 수 있습니다.

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