복붙노트

[SQL] 테이블의 기본 키에 대한 가장 좋은 방법은 무엇입니까?

SQL

테이블의 기본 키에 대한 가장 좋은 방법은 무엇입니까?

테이블을 설계 할 때, 나는 고유 나는 차 키를 만드는 것이 하나 개의 컬럼을 갖는 습관을 개발했습니다. 이것은 요구 사항에 따라 세 가지 방법으로 이루어집니다 :

숫자 3은 대부분 같은 년 또는 다른 번호와 같은 고유 한 고정 길이 문자열 코드, 또는 숫자 값을 가질 수있는 테이블을 읽고, 매우 작은 조회에 사용된다.

대부분의 경우, 다른 모든 테이블 중 하나를 자동 증가 정수 또는 고유 식별자 기본 키가됩니다.

나는 최근에 일관된 행 식별자 및 기본 키는 현재 여러 컬럼에 걸쳐 클러스터되지 않은이 데이터베이스 작업을 시작했습니다. 몇 가지 예 :

이것에 대한 유효한 경우가 있습니까? 나는 항상 이러한 경우에 대한 신원이나 고유 식별자 열을 정의한 것이다.

또한 모두에서 기본 키없이 많은 테이블이 있습니다. 이를 위해 (있는 경우), 유효한 이유는 무엇입니까?

나는 그들이 있었다으로 테이블이 디자인 된 이유를 이해하기 위해 노력하고있어, 나에게 큰 혼란을 것으로 보인다,하지만 어쩌면 그것은 충분한 이유가 있었다.

내가 대답 해독 도움의 종류에 세 번째 질문 : 경우에 여러 열이 복합 기본 키를 구성하는 데 사용되는, 특정의 장점은 대리 / 인공 키 대이 방법이 있습니까? 나는 등 성능, 유지 보수, 관리에 관해서 주로 생각하고 있어요?

해결법

  1. ==============================

    1.나는 몇 가지 규칙을 따르십시오 :

    나는 몇 가지 규칙을 따르십시오 :

    자연 키 대 대리, 나는 위의 규칙을 참조하십시오. 자연 키가 작고 변경하지 않을 경우는 기본 키로 사용할 수 있습니다. 자연 키가 크거나 변경 될 경우 나는 대리 키를 사용합니다. 기본 키가없는 경우 난 여전히 당신은 항상 당신의 스키마에 테이블을 추가하고이 자리에 기본 키를 넣어 좋겠 것이다 경험 쇼 때문에 대리 키를 확인합니다.

  2. ==============================

    2.자연 구절 인공 키는 데이터베이스 커뮤니티 간의 종교 논쟁의 일종이다 - 그것은으로 연결이 문서 등을 참조하십시오. 나는 항상 가진 인공 키에 찬성하지도는 아니지만,도를 가진 적이의. 나는 예를 들어, 경우에 따라 결정하는 것입니다 :

    자연 구절 인공 키는 데이터베이스 커뮤니티 간의 종교 논쟁의 일종이다 - 그것은으로 연결이 문서 등을 참조하십시오. 나는 항상 가진 인공 키에 찬성하지도는 아니지만,도를 가진 적이의. 나는 예를 들어, 경우에 따라 결정하는 것입니다 :

    인공 키가 사용되는 곳마다, 당신은 항상 또한 자연 키에 고유 제한 조건을 선언해야합니다. 예를 들어 당신이해야하는 경우, 사용 STATE_ID,하지만 당신은 더 나은 그렇지 않으면 당신은 결국 끝낼에 확신, STATE_CODE에 고유 제한 조건을 선언하는 것입니다 :

    state_id    state_code   state_name
    137         TX           Texas
    ...         ...          ...
    249         TX           Texas
    
  3. ==============================

    3.종종 간과되는 무언가에 그냥 추가 코멘트. 때로는 대리 키를 사용하지 않는 것은 자식 테이블의 장점이 있습니다. 이제 우리가 당신은 하나의 데이터베이스에서 여러 회사를 실행할 수있는 디자인을 가지고 있다고 가정 해 봅시다 (어쩌면 호스팅 솔루션, 또는 어떤이다).

    종종 간과되는 무언가에 그냥 추가 코멘트. 때로는 대리 키를 사용하지 않는 것은 자식 테이블의 장점이 있습니다. 이제 우리가 당신은 하나의 데이터베이스에서 여러 회사를 실행할 수있는 디자인을 가지고 있다고 가정 해 봅시다 (어쩌면 호스팅 솔루션, 또는 어떤이다).

    이제 우리는 이러한 테이블과 열이 있다고 가정 해 봅시다 :

    Company:
      CompanyId   (primary key)
    
    CostCenter:
      CompanyId   (primary key, foreign key to Company)
      CostCentre  (primary key)
    
    CostElement
      CompanyId   (primary key, foreign key to Company)
      CostElement (primary key)
    
    Invoice:
      InvoiceId    (primary key)
      CompanyId    (primary key, in foreign key to CostCentre, in foreign key to CostElement)
      CostCentre   (in foreign key to CostCentre)
      CostElement  (in foreign key to CostElement)
    

    마지막 비트가 이해가되지 않는 경우, Invoice.CompanyId는 두 개의 외래 키의 CostCentre 테이블 하나와 CostElement 테이블에 하나의 일부입니다. 기본 키 (InvoiceId, 회사 ID)입니다.

    이 모델에서는 최대 나사와 한 회사에서 CostElement 및 다른 회사에서 CostCentre을 참조 할 수 없습니다. 대용 키가 CostElement 및 CostCentre 테이블에 사용 된 경우, 그것은 것입니다.

    적을 가능성이 더 나은, 망치합니다.

  4. ==============================

    4.나는 하나의 단순한 이유로 자연 키를 사용하지 마십시오 - 인간의 오류입니다. 자연 고유 식별자가 종종 사용할 수 있지만 (SSN은 VIN 등 계좌 번호는), 그들은 올바르게 입력 할 사람이 필요합니다. 기본 키로 사회 보장 번호 (SSN)를 사용하는 경우, 누군가가 데이터 입력시 숫자의 몇 이항하고, 오류가 다음 기본 키를 변경에 직면하고, 즉시 발견되지 않습니다.

    나는 하나의 단순한 이유로 자연 키를 사용하지 마십시오 - 인간의 오류입니다. 자연 고유 식별자가 종종 사용할 수 있지만 (SSN은 VIN 등 계좌 번호는), 그들은 올바르게 입력 할 사람이 필요합니다. 기본 키로 사회 보장 번호 (SSN)를 사용하는 경우, 누군가가 데이터 입력시 숫자의 몇 이항하고, 오류가 다음 기본 키를 변경에 직면하고, 즉시 발견되지 않습니다.

    내 기본 키는 모든 백그라운드에서 데이터베이스 프로그램에 의해 처리되고, 사용자는 그들의 인식 결코 없다.

  5. ==============================

    5.자연 키의 다양한 분야에서 기본 키를 만드는 문제를 놈의 않습니다.

    자연 키의 다양한 분야에서 기본 키를 만드는 문제를 놈의 않습니다.

    당신은 대리 키를 만들기 위해 (후보 필드에 고유 인덱스와 관련된)는 ID 열을 사용할 수 있습니다.

    오래된 토론 그거 .... 나는 대부분의 상황에서 대리 키를 선호합니다.

    그러나 키의 부족에 대한 변명이 없습니다.

    RE : EDIT

    그래, 그것에 대해 많은 논쟁이 놈의 : D를

    나는 그들이 자연 선택이라는 사실 외에, 자연 키에 명백한 이점을 참조하지는. 당신은 항상 이름, SocialNumber 생각한다 - 또는 그런 일 - 대신 idPerson의.

    대리 키가 자연 키 (예를 들어 전파 변경)을 가지고 몇 가지 문제에 대한 답이다.

    당신이 대리에 익숙해, 그것은 더 깨끗하고 관리 보인다.

    또는 사고 방식 - 그러나 결국, 그것은 단지 취향의 문제입니다 것을 알 수 주어질거야 -. 사람들은 자연 키 "좋은 생각", 그리고 다른하지는.

  6. ==============================

    6.테이블은 기본 키 모든 시간을 가져야한다. 그렇지 않은 경우 그것은 자동 증가 필드되어 있어야합니다.

    테이블은 기본 키 모든 시간을 가져야한다. 그렇지 않은 경우 그것은 자동 증가 필드되어 있어야합니다.

    그들은 많은 양의 데이터를 전송하고이 과정을 느리게 (데이터베이스의 의존) 수도 있기 때문에 언젠가 사람들은 기본 키를 생략합니다. 하지만, 그것은 뒤에 추가해야합니다.

    링크 테이블에 대한 어떤 한 의견은,이는 예외입니다하지만 필드 FK가 무결성을 유지하는 것, 권리 및 링크에서 중복이 허가되지도 경우에 해당 필드가 기본 키가 될 수있는 몇 가지 경우입니다 ...하지만에 계속 예외가 프로그램에서 종종 무언가가 간단한 형태 때문에, 기본 키는 데이터의 무결성을 유지하기 위해 존재해야한다.

  7. ==============================

    7.모든 좋은 답변 게다가, 난 그냥 방금 읽은 좋은 기사, 위대한 기본 키 논쟁을 공유하고자합니다.

    모든 좋은 답변 게다가, 난 그냥 방금 읽은 좋은 기사, 위대한 기본 키 논쟁을 공유하고자합니다.

    그냥 몇 가지 포인트를 인용합니다 :

    각 테이블에 대한 기본 키를 선택할 때 개발자는 몇 가지 규칙을 적용해야합니다 :

    자연 키는 규칙을 위반 (경향). 대리 키는 규칙을 준수합니다. (당신은 더 나은, 그것은 가치가 당신의 시간이 그 기사를 읽어!)

  8. ==============================

    8.스키마에있는 테이블의 목적은 무엇인가? 테이블의 키의 목적은 무엇인가? 기본 키에 대한 특별한 무엇입니까? 기본 키 주변의 토론은 기본 키가 테이블의 일부이며, 그 테이블이 스키마의 일부라는 점을 놓칠 것 같다. 사용되는 키를 구동해야하는 테이블과 테이블의 관계에 대한 가장 좋은 것입니다.

    스키마에있는 테이블의 목적은 무엇인가? 테이블의 키의 목적은 무엇인가? 기본 키에 대한 특별한 무엇입니까? 기본 키 주변의 토론은 기본 키가 테이블의 일부이며, 그 테이블이 스키마의 일부라는 점을 놓칠 것 같다. 사용되는 키를 구동해야하는 테이블과 테이블의 관계에 대한 가장 좋은 것입니다.

    표 (테이블 관계)는 기록하고자하는 정보에 대한 사실을 포함하고 있습니다. 이러한 사실 자체에 포함 된 의미, 쉽게 이해하고, 비 모순해야한다. 디자인 관점에서, 스키마에서 추가 또는 제거 다른 테이블은 문제의 테이블에 영향을주지해야한다. 정보 만 자체에 관련된 데이터를 저장하기위한 목적이 있어야합니다. 테이블에 저장되어있는 것을 이해하는 것은 과학 연구 프로젝트를 진행 필요가 없습니다. 같은 목적을 위해 저장 아니 사실은 두 번 이상 저장 될 수 없습니다. 키는 전체 또는 고유 기록되는 정보의 일부이며, 기본 키, 그냥 삽입 즉,이 데이터 일관성 및 사용을 위해 선택해야 테이블 (에 대한 기본 액세스 포인트가 될 특별히 지정된 키가 아닌 공연).

    그것은 기본 키는 필요에 따라 작게해야한다고 말했다. 나는 것 키가 필요한만큼만 큰해야한다고 말한다. 무작위로 테이블에 의미가 필드를 추가하는 것은 피해야한다. 이 (가) 아닌 기본 키를 다른 테이블에서 종속성을 가입 파괴 특히, 임의로 추가 의미 필드의 키를 만들기 위해 더 나쁜 것입니다. 테이블에 좋은 후보 키가없는 경우에만 합리적이지만,이 사건은 반드시 모든 테이블에 사용되는 경우 가난한 스키마 디자인의 표시이다.

    또한 기본 키는 항상 질문을 밖으로해야 기본 키를 갱신으로 변경하지 않을 것을 말했다. 그러나 업데이트는 삭제가 삽입 다음과 동일합니다. 이 논리함으로써, 당신은 하나의 키가있는 테이블에서 레코드를 삭제해서는 안 후 두 번째 키를 다른 레코드를 추가합니다. 대리 기본 키를 추가하면 테이블에있는 다른 키가 존재한다는 사실을 제거하지 않습니다. 다른 테이블은 대리 키가 '가공'변경된 상태 정보를 갖는 (대리 키를 통해 예 상태 테이블을 의미에 대한 종속성을 가지고있는 경우, 데이터의 의미를 파괴 할 수있는 테이블의 기본 키가 아닌 업데이트 '취소 '것 확실히 손상된 데이터). 문제는 데이터의 의미를 파괴의 항상 무엇을해야합니다.

    이 말을하는 데, 나는 작품의 끝없는 양이 적절한 데이터베이스 디자인을 이해하는 사람들이 있다는 것을 의미하기 때문에, 기업에서 오늘 (의미 - 대리 - 키 입력 데이터 손상-1NF의 짐승)에 존재하는 많은 잘못 설계된 데이터베이스에 대한 감사 . 그러나 슬픈 측면에서, 때로는 나 시시포스 같은 느낌 않지만, 나는 그가 (충돌하기 전에)는 401K의 한 지옥이 있었다 내기. 중요한 데이터베이스 설계 질문에 대한 블로그 및 웹 사이트 접근하지 말 것. 당신이 데이터베이스를 디자인하는 경우, CJ 날짜를 찾아보십시오. 또한 SQL Server에 대한 Celko를 참조 할 수 있습니다,하지만 당신은 먼저 코를 잡아 경우에만 가능합니다. 오라클의 측면에서, 톰 카이트를 참조합니다.

  9. ==============================

    9.자연 키를 사용할 경우, 일반적으로 가장 좋습니다. 그래서, 날짜 / 숯불이 행을 고유하게 식별하고 두 부분 좋아요 행에 의미있는 경우.

    자연 키를 사용할 경우, 일반적으로 가장 좋습니다. 그래서, 날짜 / 숯불이 행을 고유하게 식별하고 두 부분 좋아요 행에 의미있는 경우.

    다만 날짜는 의미이며, 문자는 다음뿐만 아니라 단지 확인 필드에 갈 수도, 그것은 고유하게 만들기에 압정으로 고정됩니다.

  10. ==============================

    10.자연은 나에게 인공 키 대 당신이 당신의 데이터베이스에 방법을 비즈니스 로직의 대부분의 문제이다. 사회 보장 번호 (SSN)가 좋은 예입니다.

    자연은 나에게 인공 키 대 당신이 당신의 데이터베이스에 방법을 비즈니스 로직의 대부분의 문제이다. 사회 보장 번호 (SSN)가 좋은 예입니다.

    "내 데이터베이스 것이며, 반드시 각 클라이언트는 소셜 시큐리티 번호가 있습니다." 빵, 수행, 그것은 기본 키하고 그것을 함께 할 수. 비즈니스 규칙은 당신이 불에있어 변경하면 그냥 기억한다.

    나는 인해 비즈니스 규칙을 변경 내 경험이 아닌 자신을 자연의 키와 같은 기능을 수행합니다. 당신의 확신은 변경하지 않을 경우, 그것은 몇 가지 중요한 조인하지 못할 수도 있습니다.

  11. ==============================

    11.여기에 내가 개발 경험의 25 + 년 이후에 정착 엄지 손가락을 내 자신의 규칙이 있습니다.

    여기에 내가 개발 경험의 25 + 년 이후에 정착 엄지 손가락을 내 자신의 규칙이 있습니다.

    기본 키는 최적화를 위해 데이터베이스에서 사용되는 많은 특정 개체를 식별하거나 특정 개체에 관한 것보다 아무것도 응용 프로그램에서 사용할 수 없습니다.

    항상 단일 값 기본 키를 가진 것은 매우 간단 UPSERTs을 수행한다.

    응용 프로그램에서 의미가 다중 열 키를 지원하기 위해 추가 인덱스를 사용합니다.

  12. ==============================

    12.나는 스티븐 A. 로우의 롤업 신문 치료가 원본 데이터 구조의 디자이너에 필요합니다 생각한다.

    나는 스티븐 A. 로우의 롤업 신문 치료가 원본 데이터 구조의 디자이너에 필요합니다 생각한다.

    제쳐두고, 기본 키의 GUID는 성능 돼지 일 수있다. 나는 그것을 추천하지 않을 것입니다.

  13. ==============================

    13.당신은 '복합'또는 '화합물'기본 키를 사용해야합니다 여러 필드로 구성되어있다.

    당신은 '복합'또는 '화합물'기본 키를 사용해야합니다 여러 필드로 구성되어있다.

    이것은 완벽하게 허용 솔루션, 추가 정보를 원하시면 여기입니다 :)

  14. ==============================

    14.나도 항상 숫자 ID 열을 사용합니다. 오라클에서 나는 번호 (12,0) 위의 진짜 이유 번호 (18,0)를 사용 (또는 무엇이든 오래보다는 int를 인)에 몇 억 개 행을 얻기에 관하여 이제까지 걱정에 어쩌면 난 그냥 싶지 않아, DB를!

    나도 항상 숫자 ID 열을 사용합니다. 오라클에서 나는 번호 (12,0) 위의 진짜 이유 번호 (18,0)를 사용 (또는 무엇이든 오래보다는 int를 인)에 몇 억 개 행을 얻기에 관하여 이제까지 걱정에 어쩌면 난 그냥 싶지 않아, DB를!

    나는 또한 유용 할 것 같습니다 기본적인 추적을위한 생성 및 수정 된 열 (유형 타임 스탬프)를 포함한다.

    나는 컬럼의 다른 조합에 고유 제한 조건을 설정하는 마음을하지 않지만 내가 정말 내 ID를 생성, 수정 기본 요구 사항 등이있다.

  15. ==============================

    15.나는 자연의 기본 키를 찾아 어디 내가 할 수있는 그들을 사용합니다.

    나는 자연의 기본 키를 찾아 어디 내가 할 수있는 그들을 사용합니다.

    자연적인 키를 찾을 수없는 경우, 나는 INT ++ 때문에 SQL 서버를 사용 나무에 GUID를 선호하고, 항상 나무의 끝 부분에 키를 추가 나쁘다.

    다 대다 커플 링있는 테이블에 나는 외부 키의 화합물 기본 키를 사용합니다.

    나는 프로파일 러 쿼리 분석기 실행 계획 및 통계를 공부하고 내 키가 아주 쉽게 수행하는 방법을 찾을 수 있습니다 SQL 서버 I을 사용하는 운니까.

  16. ==============================

    16.나는 항상 일련 번호 또는 정체성 필드를 사용합니다.

    나는 항상 일련 번호 또는 정체성 필드를 사용합니다.

    나는 기본 키로 SSN을 사용했다하고 있기 때문에 HIPAA 규정의 "MEMBERID"에 변화를 강제로 클라이언트 근무 및 관련 테이블의 외래 키를 업데이트 할 때이 문제의 톤을 일으키는 원인이되었다. ID 열 일관된 기준에 집착하는 것은 내 모든 프로젝트에서 유사한 문제가 발생하지 않도록 도왔다.

  17. ==============================

    17.모든 테이블은 기본 키가 있어야합니다. 그렇지 않으면, 당신이해야하는 것은 힙입니다 - 이것은 어떤 상황에서, (데이터가 다음 예를 들어 다른 데이터베이스 또는 테이블에 서비스 브로커를 통해 복제 될 때 무거운 삽입 부하) 당신이 원하는 수 있습니다.

    모든 테이블은 기본 키가 있어야합니다. 그렇지 않으면, 당신이해야하는 것은 힙입니다 - 이것은 어떤 상황에서, (데이터가 다음 예를 들어 다른 데이터베이스 또는 테이블에 서비스 브로커를 통해 복제 될 때 무거운 삽입 부하) 당신이 원하는 수 있습니다.

    행의 낮은 볼륨 조회 테이블의 경우, 이것이 INT보다 적은 공간을 필요로 당신은 기본 키로 3 CHAR 코드를 사용할 수 있지만, 성능 차이는 무시할 수있다. 당신은 아마도 관련된 테이블에서 외래 키에서 만든 복합 기본 키가있는 참조 테이블이 없다면 다른 것보다, 나는 항상 INT를 사용합니다.

  18. ==============================

    18.당신은 정말 오래된 논쟁에 다시 모든 앞뒤를 통해 읽으려면, 스택 오버플로 "자연 키"에 대한 검색을 수행. 당신은 결과의 페이지를 다시 받아야합니다.

    당신은 정말 오래된 논쟁에 다시 모든 앞뒤를 통해 읽으려면, 스택 오버플로 "자연 키"에 대한 검색을 수행. 당신은 결과의 페이지를 다시 받아야합니다.

  19. ==============================

    19.GUID를 기본 키로 사용할 수 있습니다,하지만 당신은 그것을 잘 수행 할 수 있도록 GUID의 오른쪽 유형을 작성해야합니다.

    GUID를 기본 키로 사용할 수 있습니다,하지만 당신은 그것을 잘 수행 할 수 있도록 GUID의 오른쪽 유형을 작성해야합니다.

    당신은 빗 GUID를 생성해야합니다. 그것은 및 성능 통계에 대한 좋은 기사입니다 기본 키 등의 GUID의 비용.

    또한 SQL에 빗 GUID를 구축에 대한 몇 가지 코드는 정체성 (아카이브) 대 고유 식별자입니다.

  20. ==============================

    20.우리는 많이 할 조인 및 복합 기본 키는 단지 성능 돼지되고있다. 긴 간단한의 INT 또는 두 번째 후보 키를 도입에도 불구하고 많은 문제를 해결할 수 있지만 때로는 훨씬 더 쉽게 세 대 한 필드에 가입하는 것이 더 이해할 수있다.

    우리는 많이 할 조인 및 복합 기본 키는 단지 성능 돼지되고있다. 긴 간단한의 INT 또는 두 번째 후보 키를 도입에도 불구하고 많은 문제를 해결할 수 있지만 때로는 훨씬 더 쉽게 세 대 한 필드에 가입하는 것이 더 이해할 수있다.

  21. ==============================

    21.나는 자연 키에 대한 내 취향에 대한 전면까지있을거야 - 가능한 경우가 훨씬 쉽게 데이터베이스 관리의 인생을 만들어 줄게으로 그들을 사용합니다. 나는 모든 테이블은 다음과 같은 열을 가지고 우리 회사의 표준을 확립 :

    나는 자연 키에 대한 내 취향에 대한 전면까지있을거야 - 가능한 경우가 훨씬 쉽게 데이터베이스 관리의 인생을 만들어 줄게으로 그들을 사용합니다. 나는 모든 테이블은 다음과 같은 열을 가지고 우리 회사의 표준을 확립 :

    행 ID는 테이블 당 그것에 고유 키를 가지고 있으며, 어떤 경우에 자동으로 생성 된 행 당 (및 권한을 편집 사람을 방지), 그리고 합리적으로 모든 테이블 및 데이터베이스에서 고유 보장됩니다. 어떤 ORM 시스템은 하나의 ID 키가 필요한 경우,이 사용하는 것입니다.

    한편, 실제 PK 가능하다면, 천연 키이다. 내 내부 규칙은 같은입니다 :

    그래서 이상적으로 당신은 자연, 인간이 읽기 쉽고 기억에 남는 PK와 끝까지, 그리고 ORM 친화적 한 ID 당 테이블 GUID.

    경고 : 당신이 큰 시스템의 경험이 있다면이 유지 데이터베이스, 기록보다는 수백만 또는 수십억의 10 만여하는 경향이 그렇게 내 충고를 contraindicates하는 날 무시 주시기 바랍니다!

  22. from https://stackoverflow.com/questions/337503/whats-the-best-practice-for-primary-keys-in-tables by cc-by-sa and MIT license