복붙노트

[SQL] 기본 키 또는 고유 색인?

SQL

기본 키 또는 고유 색인?

작업에서 우리는 고유 인덱스 대신 기본 키 및 모든 작품 벌금과 큰 데이터베이스를 가지고있다.

나는 새로운 프로젝트에 대한 새 데이터베이스를 설계 그리고 난 딜레마를 가지고 :

DB 이론에서, 기본 키는 기본 요소, OK, 그러나 모두의 장점과 단점이 무엇인지 REAL 프로젝트인가?

당신은 프로젝트에 무엇을 사용합니까?

편집 : ... 그리고 무엇 MS SQL 서버의 기본 키와 복제에 대한?

해결법

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

    1.고유 인덱스는 무엇입니까?

    고유 인덱스는 무엇입니까?

    열에 고유 인덱스는 두 개의 서로 다른 행에 해당 열의 두 개의 같은 값을 가지고 할 수 없다는 제약 조건을 적용하는 열에 인덱스입니다. 예:

    CREATE TABLE table1 (foo int, bar int);
    CREATE UNIQUE INDEX ux_table1_foo ON table1(foo);  -- Create unique index on foo.
    
    INSERT INTO table1 (foo, bar) VALUES (1, 2); -- OK
    INSERT INTO table1 (foo, bar) VALUES (2, 2); -- OK
    INSERT INTO table1 (foo, bar) VALUES (3, 1); -- OK
    INSERT INTO table1 (foo, bar) VALUES (1, 4); -- Fails!
    
    Duplicate entry '1' for key 'ux_table1_foo'
    

    이 두 번째로이 칼럼에 값 1을 삽입하려고 할 때 열 foo는에 고유 인덱스를 위반 마지막으로 삽입이 실패합니다.

    MySQL의에서 고유 제한 조건은 여러 널 (null)을 할 수 있습니다.

    여러 열에 대한 고유 인덱스를 만들 수 있습니다.

    고유 인덱스 대 기본 키

    동일 것들 :

    다른 것들 :

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

    2.이처럼 볼 수 있습니다 :

    이처럼 볼 수 있습니다 :

    기본 키 IS 고유

    유니크 값은 요소의 표현 될 필요가 없습니다

    의미?; 당신이 "사람"이 경우에 그래서 기본 키 당신은 당신의 사람에 차있는 개인 식별 번호 (SSN 또는)가 좋아, 요소를 식별하는 것이 사용된다.

    한편, 사람은 독특하지만 사람을 식별하지 않는 이메일을 가질 수 있습니다.

    나는 항상 내가 그들있을 수 있습니다 심지어 (중반 테이블 / 연결 테이블) 관계 테이블에 기본 키가 있습니다. 왜? > 자동차뿐만 아니라 식별자를 가져야한다 - 그럼 난 코딩 할 때 "사람은"식별자가있는 경우, 자동차가 잘 식별자를 가지고, 그 사람 표준을 따르도록 좋아!

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

    3.외부 키는 고유 제한 조건뿐만 아니라 기본 키와 함께 작동합니다. 온라인에서 :

    외부 키는 고유 제한 조건뿐만 아니라 기본 키와 함께 작동합니다. 온라인에서 :

    트랜잭션 복제의 경우, 기본 키가 필요합니다. 온라인에서 :

    두 답변은 SQL 서버 2005입니다.

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

    4.자연 키에 반대 대리 기본 키를 사용하는 경우의 선택은 까다 롭습니다. 등과 같은 답변은 항상 또는 전혀, 드물게 유용합니다. 나는 상황에 따라 달라집니다 찾을 수 있습니다.

    자연 키에 반대 대리 기본 키를 사용하는 경우의 선택은 까다 롭습니다. 등과 같은 답변은 항상 또는 전혀, 드물게 유용합니다. 나는 상황에 따라 달라집니다 찾을 수 있습니다.

    예를 들어, 나는 다음과 같은 테이블이 :

    CREATE TABLE toll_booths (
        id            INTEGER       NOT NULL PRIMARY KEY,
        name          VARCHAR(255)  NOT NULL,
        ...
        UNIQUE(name)
    )
    
    CREATE TABLE cars (
        vin           VARCHAR(17)   NOT NULL PRIMARY KEY,
        license_plate VARCHAR(10)   NOT NULL,
        ...
        UNIQUE(license_plate)
    )
    
    CREATE TABLE drive_through (
        id            INTEGER       NOT NULL PRIMARY KEY,
        toll_booth_id INTEGER       NOT NULL REFERENCES toll_booths(id),
        vin           VARCHAR(17)   NOT NULL REFERENCES cars(vin),
        at            TIMESTAMP     DEFAULT CURRENT_TIMESTAMP NOT NULL,
        amount        NUMERIC(10,4) NOT NULL,
        ...
        UNIQUE(toll_booth_id, vin)
    )
    

    우리는 두 엔티티 테이블 (toll_booths 자동차) 및 트랜잭션 테이블 (drive_through)가 있습니다. 이 변화에 보장되지 않으므로 자연적인 속성이 없기 때문에 toll_booth 테이블 대리 키를 사용 (이름을 쉽게 변경 될 수 있습니다). 이 아닌 변경 식별자 (VIN)을 갖기 때문에 차량에 나타난 천연 차 키를 사용한다. drive_through 트랜잭션 테이블은 쉽게 식별 할 수 있도록 서로 게이트 키를 사용뿐만 아니라 레코드가 삽입 될 때 고유성을 보장받을 수 있습니다 속성에 고유 제한 조건이 있습니다.

    http://database-programmer.blogspot.com이 특정 주제에 대한 몇 가지 좋은 기사를 가지고있다.

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

    5.기본 키의 어떤 단점이 없습니다.

    기본 키의 어떤 단점이 없습니다.

    표는 (그들은 STH 같은 말 끝날 일부 응용 프로그램에서 데이터를 편집 할 수 없습니다 예를 들어 기본 키가없는 @MrWiggles 및 @ 피터 파커의 대답에 그냥 몇 가지 정보를 추가 할 수없는 편집 / 삭제 데이터없이 기본 키). PostgreSQL은 PRIMARY KEY는 널 (null)을 허용하지 않는, 여러 NULL 값이 UNIQUE 컬럼에있을 수 있습니다. 또한 코드를 생성 일부 ORM은 기본 키가없는 테이블에 몇 가지 문제가있을 수 있습니다.

    최신 정보:

    내가 아는 한 적어도 문제 (세부 사항)하지 않고, MSSQL에서 기본 키없이 테이블을 복제 할 수 없습니다.

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

    6.무언가가 당신의 DB 엔진에 따라, 기본 키의 경우, 전체 테이블은 기본 키를 기준으로 정렬됩니다. 이 인덱스의 다른 종류의 함께 할 수있다로 어떤 역 참조 할 필요가 없기 때문에이 방법은 조회를 훨씬 빠르게 기본 키에 있음. 게다가, 그것은 단지 이론이다.

    무언가가 당신의 DB 엔진에 따라, 기본 키의 경우, 전체 테이블은 기본 키를 기준으로 정렬됩니다. 이 인덱스의 다른 종류의 함께 할 수있다로 어떤 역 참조 할 필요가 없기 때문에이 방법은 조회를 훨씬 빠르게 기본 키에 있음. 게다가, 그것은 단지 이론이다.

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

    7.다른 답변이 말한뿐만 아니라, 일부 데이터베이스 및 시스템이 존재하는 기본이 필요할 수 있습니다. 하나의 상황이 마음에 온다; 인포믹스와 기업 복제를 사용하는 경우 테이블이 복제에 참여하기 위해 PK가 있어야합니다.

    다른 답변이 말한뿐만 아니라, 일부 데이터베이스 및 시스템이 존재하는 기본이 필요할 수 있습니다. 하나의 상황이 마음에 온다; 인포믹스와 기업 복제를 사용하는 경우 테이블이 복제에 참여하기 위해 PK가 있어야합니다.

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

    8.만큼 당신이 값에 NULL을 허용하지 않는 한, 그들은 동일하게 처리되어야하지만 NULL 값이 AFAIK MS-SQL이 하나 이상의 (1) NULL 값을 허용하지 않는 (데이터베이스에서 다르게 처리되고, MySQL과 오라클이 허용 , 열)는 고유 한 경우 그래서 당신은이 열에 NOT NULL UNIQUE INDEX를 정의해야합니다

    만큼 당신이 값에 NULL을 허용하지 않는 한, 그들은 동일하게 처리되어야하지만 NULL 값이 AFAIK MS-SQL이 하나 이상의 (1) NULL 값을 허용하지 않는 (데이터베이스에서 다르게 처리되고, MySQL과 오라클이 허용 , 열)는 고유 한 경우 그래서 당신은이 열에 NOT NULL UNIQUE INDEX를 정의해야합니다

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

    9.이 관계형 데이터 이론의 기본 키 같은 건 없다, 그래서 당신의 질문은 실제적인 수준에 대답 할 수있다.

    이 관계형 데이터 이론의 기본 키 같은 건 없다, 그래서 당신의 질문은 실제적인 수준에 대답 할 수있다.

    고유 인덱스는 SQL 표준의 일부가 아닙니다. DBMS에의 특정 구현 고유 인덱스를 선언의 결과가 무엇인지를 결정합니다.

    문제는 거의 이론에 불과하므로 오라클에서 기본 키를 선언하는 것은, 고유 인덱스가 귀하를 대신하여 생성되는 발생합니다. 나는 다른 DBMS 제품에 대해 말할 수 없다.

    나는 기본 키를 선언 호의를. 이것은 발 키 컬럼에 널이 금지뿐만 아니라 중복을 금지하는 효과를 갖는다. 또한 엔티티 무결성을 시행 참조 제약 조건을 선언 선호. 많은 경우에 외부 키의의 coulmn에 인덱스를 선언 (들) 조인 속도가 향상됩니다. 인덱스의이 종류는 일반적으로 고유 안된다.

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

    10.UNIQUE 인덱스 대 클러스터 인덱스의 몇 가지 단점이있다.

    UNIQUE 인덱스 대 클러스터 인덱스의 몇 가지 단점이있다.

    이미 클러스터 된 인덱스는 물리적으로 주문을 테이블의 데이터를 언급 한 바와 같이.

    당신이 많이있을 때 (물론, 거의 채우기 비율에 따라) 당신이 데이터를 변경, 물리적 테이블 요구가 숙박으로 업데이트 할 수있는 클러스터 된 인덱스, 매번를 포함하는 테이블에 삽입 또는 삭제가 정렬 된 경우 있음이 평균.

    상대적으로 작은 테이블,이 괜찮지 만, 데이터의 GB의 가치를 가지고 테이블 및 insertrs에 가져올 때 / 삭제하면 문제가 실행됩니다, 정렬에 영향을 미친다.

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

    11.나는 거의 숫자 기본 키없이 테이블을 생성하지 않습니다. 고유해야 자연 키가 또한이 경우에, 나는 또한에 고유 인덱스를 넣어. 빠르고, 데이터가 하나 개의 장소에 변화를 필요로 여러 열로 자연 키보다 정수에 있습니다 (- 외래 키 관계 자연 키가 기본 키에있을 때 나쁜 일이있는 업데이트해야하는 경향이) 결합합니다. 당신이 필요 복제 사용 GUID를 대신 정수로려고하는 경우에, 그러나 대부분의 경우 나는 그들이 존 스미스와 존 스미스 구별를 참조해야하는 경우 읽을 특히 사용자입니다 키를 선호합니다.

    나는 거의 숫자 기본 키없이 테이블을 생성하지 않습니다. 고유해야 자연 키가 또한이 경우에, 나는 또한에 고유 인덱스를 넣어. 빠르고, 데이터가 하나 개의 장소에 변화를 필요로 여러 열로 자연 키보다 정수에 있습니다 (- 외래 키 관계 자연 키가 기본 키에있을 때 나쁜 일이있는 업데이트해야하는 경향이) 결합합니다. 당신이 필요 복제 사용 GUID를 대신 정수로려고하는 경우에, 그러나 대부분의 경우 나는 그들이 존 스미스와 존 스미스 구별를 참조해야하는 경우 읽을 특히 사용자입니다 키를 선호합니다.

    내가 다 대다 관계에 참여하는 가입 테이블이있을 때 나는 대리 키를 생성하지 않는 몇 번 있습니다. 이 경우에는 내가 기본 키로 두 필드를 선언합니다.

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

    12.나의 이해는 기본 키와하지 ​​null이 제약 조건 고유 인덱스가 동일 (*)이다; 나는 하나 하나 지정이 명시 적으로 진술 또는 (당신이 표현하고 명시 적으로 시행 할 작업의 문제를) 무엇을 의미하는지에 따라 다른 선택 가정합니다. 그 고유성이 아닌 null이 필요한 경우, 다음 기본 키합니다. 그냥 고유 인덱스의 모든 부분, 즉에 대한 요구 사항이없는 것은 아니다 null이 발생하는 경우, 그냥 고유 인덱스합니다.

    나의 이해는 기본 키와하지 ​​null이 제약 조건 고유 인덱스가 동일 (*)이다; 나는 하나 하나 지정이 명시 적으로 진술 또는 (당신이 표현하고 명시 적으로 시행 할 작업의 문제를) 무엇을 의미하는지에 따라 다른 선택 가정합니다. 그 고유성이 아닌 null이 필요한 경우, 다음 기본 키합니다. 그냥 고유 인덱스의 모든 부분, 즉에 대한 요구 사항이없는 것은 아니다 null이 발생하는 경우, 그냥 고유 인덱스합니다.

    유일한 나머지 차이점은 여러 개의 기본 키를 가질 수 없습니다 동안은 배수가 아닌 null이 고유 인덱스를 가질 수있다.

    (*) 실제 차이 이외에서는 : 기본 키가 외부 키를 정의와 같은 일부 작업의 기본 고유 키가 될 수 있습니다. 전의. 하나는 참조 테이블에 기본 키가있는 경우 외부 키가 테이블을 참조하고 열 이름을 제공하지 않습니다으로 정의하면, 기본 키는 참조 열 수 있습니다. 그렇지 않으면, 참조 된 열은 명시 적으로 명명해야합니다.

    다른 사람들은 여기에 DB 복제를 언급 한,하지만 난 그것에 대해 알고하지 않습니다.

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

    13.고유 인덱스는 하나 개의 NULL 값을 가질 수 있습니다. 이 클러스터되지 않은 색인을 생성합니다. 기본 키는 NULL 값을 포함 할 수 없습니다. 그것은 클러스터 된 인덱스를 생성합니다.

    고유 인덱스는 하나 개의 NULL 값을 가질 수 있습니다. 이 클러스터되지 않은 색인을 생성합니다. 기본 키는 NULL 값을 포함 할 수 없습니다. 그것은 클러스터 된 인덱스를 생성합니다.

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

    14.MSSQL에서, 기본 키는 단조 클러스터 된 인덱스에 최상의 성능을 증가해야한다. 따라서 정체성 인서트 정수가 일정하게 증가 될 수있는 자연 키보다 낫다.

    MSSQL에서, 기본 키는 단조 클러스터 된 인덱스에 최상의 성능을 증가해야한다. 따라서 정체성 인서트 정수가 일정하게 증가 될 수있는 자연 키보다 낫다.

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

    15.그것은 나에게 있다면 ...

    그것은 나에게 있다면 ...

    당신은 데이터베이스 및 애플리케이션의 요구 사항을 충족해야합니다.

    기본 키가 데이터베이스 요구 사항을 담당으로 모든 테이블에 자동 증가 정수 또는 긴 id 컬럼을 추가하는 역할을합니다.

    그런 다음 응용 프로그램에서 사용하기 위해 테이블에 적어도 하나의 다른 고유 인덱스를 추가합니다. 이 등 가능한 경우 employee_id입니다 인덱스, 또는 ACCOUNT_ID, 또는 CUSTOMER_ID을, 것,이 지수는 복합 인덱스 안된다.

    나는 개별적으로 복합 인덱스를 통해 여러 필드에 인덱스를 선호한다. where 절 그 필드를 포함 할 때마다 데이터베이스는 단일 필드 인덱스를 사용하지만 정확히 올바른 순서로 필드를 제공 할 때 그것은 단지 복합을 사용합니다 - 당신이 제공하지 않는 한이 복합 인덱스의 두 번째 필드를 사용할 수 없습니다 의미 당신의 where 절에있는 제 1 및 제 2 둘 다.

    나는 계산 또는 기능 유형의 인덱스를 사용하는 모든입니다 - 복합 인덱스 이상을 사용하는 것이 좋습니다 것입니다. 그것은 매우 쉽게 where 절에 같은 기능을 사용하여 기능 인덱스를 사용 할 수 있습니다.

    이 응용 프로그램의 요구 사항을 담당한다.

    그것은 가능성이 높다 아닌 다른 차 인덱스가 실제로 기본 키 값과 키 값이되지 rowid로 그 인덱스의 매핑 ()의 점이다. 물리적 정렬 운영 및 삭제이 인덱스를 다시 만들 필요없이 발생하는이 있습니다.

  16. from https://stackoverflow.com/questions/487314/primary-key-or-unique-index by cc-by-sa and MIT license