복붙노트

[SQL] 일반적으로, 데이터베이스의 모든 테이블에는 PK로 사용할 정체성 필드를해야합니까?

SQL

일반적으로, 데이터베이스의 모든 테이블에는 PK로 사용할 정체성 필드를해야합니까?

이것은 내가 그것을 물어조차도 중복 것 같아,하지만 난 검색하고 찾을 수 없습니다. 나는 확신에도 불구하고 나는 등 거기에 많은 블로그에서 찾을 수 있습니다 - 그것은 SO에 대한 좋은 질문처럼 보인다. 그래서 당신은 블로그에 얻을 수있는 것보다 토론을 더해야합니다.

나는에 문제가 실행 해요 조인 : 너무 많은 기록을 다시 받고. 나는 "확장"으로 생각할. 나는 너무 많은 조인의 세트와 확장 된 행의 수, 방식에 테이블을 추가했다. 이런 보통 때 나는 조인에 참여하는 모든 ID 필드의 추가를 선택합니다. 그 방법은 확장이 일어나고있는 곳 꽤 명백하고 그것을 해결하기 위해 가입의 나는 ON을 변경할 수 있습니다. 이 경우를 제외하고, 내가 추가 한 테이블은 ID 필드가 없습니다. 나에게,이 문제입니다. 그러나 아마 내가 틀렸다.

질문 : 데이터베이스의 모든 테이블이 PK로 사용되는 정체성 필드를해야합니까? 모든 테이블에 ID 필드를 가진 어떤 문제점이 있습니까? 만약에 당신이있어 합리적으로 확인이 테이블은 PK / FK 관계에서 사용되지 않습니다?

관련,하지만 중복되지 : ID 열을 가진 때 좋은 아이디어 아닌가요?

분명히이 논쟁은 한동안 계속되었다. 진작 알려져 있습니다.

이 게시물이 (대리 대 자연 키)도 관련이있다.

해결법

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

    1.IDENTITY 및 PRIMARY KEY를 닫기하지만 혼동해서는 안 두 가지 개념이있다

    IDENTITY 및 PRIMARY KEY를 닫기하지만 혼동해서는 안 두 가지 개념이있다

    (드문 상황을 제외하고) 모든 테이블은 값 또는 행을 고유하게 식별하는 값의 집합 인 PRIMARY KEY를해야한다.

    왜 설명은 여기를 참조하십시오.

    IDENTITY 열 값을 증가 자동 충전되는 것을 의미하는 SQL 서버의 열 특성이다.

    이 속성의 특성상이 항목의 값은 본질적으로 고유.

    그러나, UNIQUE 제약 조건 또는 UNIQUE 인덱스가 자동으로 IDENTITY 컬럼에 생성되지 않고,이되어 명시 적으로 UNIQUE는 제한했다 않는 SET IDENTITY_INSERT ON을 실행 한 후에는, IDENTITY 열으로 중복 값을 삽입 할 수 있습니다.

    식별 컬럼은 반드시 PRIMARY KEY하지 않아야하지만, 대부분은 대리 기본 키를 입력하는 데 사용

    그것은 또는 특별한 경우에 유용 할 수도 있고 그렇지 않을 수도 있습니다.

    따라서, 귀하의 질문에 대한 답변 :

    이것은이다 :

    그것은 PRIMARY KEY로 IDENTITY를하는 가장 좋은 생각이 아니다 때 세 가지 경우는 내 마음에 와서 :

    이 모든 경우는 다음과 같은 조건을 의미 :

    최신 정보:

    다 대다 링크 테이블은 복합 키로 링크 테이블에 ID의 한 쌍을 가져야한다.

    그것은 당신이 이미 사용이 (그리고 UNIQUE을) 자연 복합 키, 그래서 이것에 대한 대리 키를 생성 할 점은 없습니다.

    난 당신이 그들이 연결 테이블 이외의 다른 테이블에서 다 대다 링크 테이블을 참조 할 것 인 이유를 볼 수 있지만하지 않는의는 이러한 필요를 가정합니다.

    이 경우, 당신은 단지 복합 키 링크 테이블을 참조합니다.

    이 쿼리 :

    CREATE TABLE a (id, data)
    CREATE TABLE b (id, data)
    CREATE TABLE ab (a_id, b_id, PRIMARY KEY (a_id, b_id))
    CREATE TABLE business_rule (id, a_id, b_id, FOREIGN KEY (a_id, b_id) REFERENCES ab)
    
    SELECT  *
    FROM    business_rule br
    JOIN    a
    ON      a.id = br.a_id
    

    이것보다 훨씬 더 효율적입니다 :

    CREATE TABLE a (id, data)
    CREATE TABLE b (id, data)
    CREATE TABLE ab (id, a_id, b_id, PRIMARY KEY (id), UNIQUE KEY (a_id, b_id))
    CREATE TABLE business_rule (id, ab_id, FOREIGN KEY (ab_id) REFERENCES ab)
    
    SELECT  *
    FROM    business_rule br
    JOIN    a_to_b ab
    ON      br.ab_id = ab.id
    JOIN    a
    ON      a.id = ab.a_id
    

    , 분명한 이유.

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

    2.거의 항상 네. 나는 일반적으로 강력한 이유가 없다 않는 한 신원 필드를 포함하여 기본. 나는 거의 같은 이유가 발생하지 않으며, 신원 필드의 비용은 그래서 일반적으로 내가 포함, 최소이다.

    거의 항상 네. 나는 일반적으로 강력한 이유가 없다 않는 한 신원 필드를 포함하여 기본. 나는 거의 같은 이유가 발생하지 않으며, 신원 필드의 비용은 그래서 일반적으로 내가 포함, 최소이다.

    내가 더 DBMS가 중요한 관계형 모델링을 제외하고 거의 모든 기능에 사용 된 관계형 데이터베이스가 아닌 데이터 저장소로 사용 된 고도의 전문 데이터베이스이었다 않았다 내 머리 위로 떨어져 생각할 수있는 유일한 것은. (이것은 대용량, 고 회전율 데이터 버퍼 것이었다).

  3. ==============================

    3.난 당신이 종종 끔찍한 데이터 무결성 또는 성능 문제가 발생할 수있는 변경 여부를 통제 할 수 없기 때문에 그 자연 키가 훨씬 더 인공 키보다 더 자주 신자 기업입니다.

    난 당신이 종종 끔찍한 데이터 무결성 또는 성능 문제가 발생할 수있는 변경 여부를 통제 할 수 없기 때문에 그 자연 키가 훨씬 더 인공 키보다 더 자주 신자 기업입니다.

    그러나, 신원 필드없이 의미를 약간 (아주 약간) 자연 키가 (주 약기가 마음에 오는 두 글자, 그것은 변화에 대한 공식 유형 약어 매우 드문 경우입니다.)

    A는 모든 테이블은 아마 또한 추가적인 신원 필드를 필요로하지 않는 많은 관계로 많은 모델 테이블을 가입 할 수 있습니다. 함께 두 개의 키 필드 만들기 기본 키가 잘 작동합니다.

    에 특정 경우에 매력적인 이유를하지 주어진하지 않는 한 나는, 일반적으로, 대부분의 다른 테이블에 신원 필드를 추가 이외. 그것은 나쁜 연습을하는 테이블에 기본 키를 만드는 데 실패하거나 실패 대리 키를 사용하는 경우 보증 고유성에 필요한 다른 필드 수 (당신이 정말로 해결 중복을 즐길 제외)에 고유 인덱스를 배치하는 것입니다.

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

    4.모든 표는 고유하게 식별하는 것이 필드 (들)의 일부 설정이 있어야합니다. 여부와 모델에 시도하는 도메인에 따라 달라집니다 데이터 필드에서 별도의 숫자 식별자 필드가있다. 모든 데이터는 쉽게 '하나의 숫자 ID'패러다임에 빠져과 같은 그것을 강제로 부적절 할 것이다. 많은 양의 데이터가 쉽게 패러다임에 맞지 않으며, 같은 같은 식별자 부를 것이다, 점을 감안. 이 항상 프로그래밍 환경에서 X을에 아무 대답이 없다, 이것은 또 다른 예이다.

    모든 표는 고유하게 식별하는 것이 필드 (들)의 일부 설정이 있어야합니다. 여부와 모델에 시도하는 도메인에 따라 달라집니다 데이터 필드에서 별도의 숫자 식별자 필드가있다. 모든 데이터는 쉽게 '하나의 숫자 ID'패러다임에 빠져과 같은 그것을 강제로 부적절 할 것이다. 많은 양의 데이터가 쉽게 패러다임에 맞지 않으며, 같은 같은 식별자 부를 것이다, 점을 감안. 이 항상 프로그래밍 환경에서 X을에 아무 대답이 없다, 이것은 또 다른 예이다.

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

    5.당신이 인공의 ID 열이있는 테이블있을 때마다 번호, 당신은 또한 테이블에 대한 자연의 기본 키를 확인하고 너무 그래서 당신은 두 행을하지 않는 컬럼의 세트에 고유 제한 조건이 있는지 확인해야합니다 사고에 의한 의미 ID 열에서 떨어져 동일합니다.

    당신이 인공의 ID 열이있는 테이블있을 때마다 번호, 당신은 또한 테이블에 대한 자연의 기본 키를 확인하고 너무 그래서 당신은 두 행을하지 않는 컬럼의 세트에 고유 제한 조건이 있는지 확인해야합니다 사고에 의한 의미 ID 열에서 떨어져 동일합니다.

    ID 열을 추가하면 무료로 비용이되지 않습니다. 일반적으로 저장 행마다 4 바이트의 식별 값을 플러스 (아마 8-12 바이트 행당 플러스 오버 헤드에서의 무게한다) 전체적으로 추가적인 인덱스 - 테이블에 불필요한 식별 컬럼을 추가의 오버 헤드가있다. 또한 테이블 당 추가 인덱스가 있기 때문에 가장 비용 효율적인 쿼리 계획을 해결하기 위해 약간 걸립니다. 부여 테이블이 작고 기계가 큰 경우,이 오버 헤드는 중요하지 않습니다 -하지만 가장 큰 시스템, 그것은 중요.

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

    6.당신이 모델링 한 경우, 설계, 표준화 등, 당신은 어떤 ID 열이 없습니다.

    당신이 모델링 한 경우, 설계, 표준화 등, 당신은 어떤 ID 열이 없습니다.

    당신은 당신의 테이블에 대한 자연의 후보 키를 식별 한 것입니다.

    당신은 (여전히 고유 제한 조건이 필요합니다) (예를 엄격하게 일정하게 증가, 숫자, 축소)을 NVARCHAR를 사용하기 때문에, 말, (100) 열이 좋은 아이디어가 아니기 때문에 물리적 아키텍처의 대리 키를 결정할 수있다.

    이념 때문에 또는 : 그들은 OO 개발자에 호소 나는 발견했습니다.

    좋아, ID 열을 가정합니다. 당신의 데시벨이 더 복잡지면서, 여러 레이어 말, 어떻게 당신이 존의 부모와 그랜드 .child 테이블을 직접. 당신은 할 수 없습니다 : 당신은 항상 중간 테이블과 잘 인덱스 PK-FL 열이 필요합니다. 복합 키, 그것은 당신을 위해 모든있다 ...

    오해하지 마십시오 : 내가 그들을 사용합니다. 내가 그들을 사용하는 이유하지만 난 알아 ...

    편집하다:

    나는 다른에 "사용 procs 저장"+ "그들이 혜택을 ID를"로, 한편으로 일치 "아니오 발동 저장" "항상 ID"+ 부씩 싶네 ...

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

    7.네, 대부분의 경우에.

    네, 대부분의 경우에.

    에지의 경우 나 예외는 같은 것들 수 있습니다 :

    하지만 그 이외의, 나는 최고의 선택 (I 자연 키를 통해 대리 키를 선호 중 하나 인 IDENTITY 필드를 사용하여 테이블의 각 행을 고유하게 식별하는 기본 키를 가지고, 내 의견에 대한 좋은 이유가 없다고 생각 - 그들은 더 많은 신뢰성, 안정성, 결코 등) 변경하지 있습니다.

    즙을 짜고 난 찌꺼기

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

    8.나는 각 테이블에 ID 필드를하는 것에 대한 어떤 단점 생각할 수 없다. 귀하의 ID 필드의 당신의 유형을 제공하는 것은 테이블이 성장하기에 충분한 공간을 제공합니다.

    나는 각 테이블에 ID 필드를하는 것에 대한 어떤 단점 생각할 수 없다. 귀하의 ID 필드의 당신의 유형을 제공하는 것은 테이블이 성장하기에 충분한 공간을 제공합니다.

    그러나, 당신은 반드시 행의 신원을 확인하기 위해 하나의 필드가 필요하지 않습니다. 그래서 더, 하나의 ID 필드는 필수하지 않습니다.

    기본 및 외래 키는 하나 개의 필드의,하지만 여러 분야의 단지로 구성 될 수 있습니다. 이는 N-N의 관계를 구현하기위한 전형적인 테이블이다.

    당신은 완벽하게 테이블에 PRIMARY KEY (FA, FB)를 할 수 있습니다 :

    CREATE TABLE t(fa INT , fb INT);
    ALTER TABLE t ADD PRIMARY KEY(fa , fb);
    
  9. ==============================

    9.아이덴티티 필드와 키 사이의 차이를 인식 ... 모든 표는 실수 같은 '실체'를 대표하는 여러 행을 입력하는 데이터 손상을 제거하기 위해, 키를 가져야한다. 테이블에있는 유일한 키가 의미 대리 키의 경우,이 함수는 효율적이 없습니다.

    아이덴티티 필드와 키 사이의 차이를 인식 ... 모든 표는 실수 같은 '실체'를 대표하는 여러 행을 입력하는 데이터 손상을 제거하기 위해, 키를 가져야한다. 테이블에있는 유일한 키가 의미 대리 키의 경우,이 함수는 효율적이 없습니다.

    OTOH, 확실히 더 테이블 '요구'정체성, 그리고하지 하나에서 모든 테이블의 장점은 ... 예는 없다 : 짧은와 기능 키를, 다른 테이블의 외래 키를 통해 참조가없는 테이블 또는있는 테이블 다른 테이블 제로 또는 온 관계로 하나에있는 테이블이 필요 ... 아이덴티티 없음

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

    10.간단한을 찾을 수 있다면 내가 말하고 싶지만, 테이블 자연 키 (즉, 하나의 열), 사용하는 키 대신에 ID 열이있다.

    간단한을 찾을 수 있다면 내가 말하고 싶지만, 테이블 자연 키 (즉, 하나의 열), 사용하는 키 대신에 ID 열이있다.

    천연 또는 생성 여부 나는 모든 행이 고유하게 어떻게 든 식별 보장하고 있기 때문에 일반적으로, 모든 테이블에 고유 한 식별자의 일종을 제공합니다.

    개인적 IDENTITY 전염병과 같은 열 (1, 2, 3, 4와 같이, ID 열을 증가) 피한다. 그들은 그 테이블에서 특히 경우는 삭제 행, 번거 로움을 많이 발생합니다. 테이블에는 자연 키가없는 대신 나도 uniqueidentifiers 생성 사용합니다.

    어쨌든,이, 수락 연습하면 아무 생각이 바로 나에게 보인다. YMMV.

  11. from https://stackoverflow.com/questions/1207983/in-general-should-every-table-in-a-database-have-an-identity-field-to-use-as-a by cc-by-sa and MIT license