복붙노트

[SQL] 복합 기본 키 : 그것이 좋은지 나쁜지

SQL

복합 기본 키 : 그것이 좋은지 나쁜지

나는 온라인 상점 시스템에 대한 데이터베이스를 설계했습니다. 나는이 웹 사이트의 일부 게시물을 읽어에서 왔어요 문제는 나쁜 관행 내가이 점에서 읽은 글에 따라 (정말, 내가 경우 복합 기본 키를 사용할 수 있지만 내가 아래에 설명 할거야이다 stackoveflow을 통해, 많은 사람들이 그것이 내가 부탁 해요 이유의) 그렇게 나쁜 관행 말한다.

나는 별도의 테이블에서 주문에 대한 지불을 저장할. 그 이유는 많은 순서 관계에 여러 형태로 별도의 테이블로 관리되는 많은 항목을 가질 수 있다는 것이다. 내가 지불 테이블 복합 기본 키를 사용하지 않는 경우 지금, 나는 나의 고유의 PaymentID을 잃게됩니다 :

[PaymentId] INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
[OrderId] INT NOT NULL PRIMARY KEY --Also a Foreign Key--

난 그냥 ORDERID의 기본 키를 제거하면 이제, 정말 많은 OrderIds 많은 PaymentIds에 연결할 수 있습니다 여기에 하나 개의 관계 내 하나를 잃을 것이고, 나는 이것을 원하지 않는다.

여기에 이전 묻는 질문 (대부분) 복합 키가 나쁜 생각이라고 결론을 내렸다 이유입니다. 그래서 내 자신이이를 명확히 할; 나쁜 경우, 가장 좋은 방법은 무엇인가?

해결법

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

    1.복합 기본 키가 나쁜 아무 결론은 없습니다.

    복합 기본 키가 나쁜 아무 결론은 없습니다.

    가장 좋은 방법은 행을 고유하게 식별 일부 열 또는 열을하는 것입니다. 그러나 일부 테이블에 하나의 컬럼은 행을 고유하게 식별 할 그 자체로는 충분하지 않습니다.

    SQL (관계형 모델) 복합 기본 키를 할 수 있습니다. 그것은 좋은 연습이 경우입니다. 또는, 보는 또 다른 방법은 모든 경우에 나쁜 방법이 아닙니다 점이다.

    어떤 사람들은 모든 테이블이 자동으로 고유 한 값을 생성하는 정수 열을해야한다는 의견을 가지고 있고, 그 기본 키 역할을한다. 어떤 사람들은이 기본 키 열은 항상 ID를 호출 할 필요가 있다고 주장한다. 그러나 사람들은 규칙, 반드시 모범 사례입니다. 그것은 어떤 결정을 단순화하기 때문에 규칙이 몇 가지 이점을 가지고있다. 그러나 규칙은 제한적입니다.

    (예를 들어, 두 개의 신용 카드) 어떤 사람들은 예약 할부에 구입하거나 다른 그들이 지불의 여러 소스를 가지고 있기 때문에 여러 지불로 주문을 할 수 있습니다, 또는 두 개의 서로 다른 사람들이 순서의 몫에 대해 지불하고자 (I 자주로 이동 친구와 레스토랑, 그리고 우리 우리 자신의 식사를 위해 각 지불, 그래서 우리의 신용 카드의 각 순서의 직원 프로세스 반).

    난 당신이 다음과 같이 설명하는 시스템을 설계하는 것입니다 :

    Products  : product_id (PK)
    
    Orders    : order_id (PK)
    
    LineItems : product_id is (FK) to Products
                order_id is (FK) to Orders
                (product_id, order_id) is (PK)
    
    Payments  : order_id (FK)
                payment_id - ordinal for each order_id
                (order_id, payment_id) is (PK)
    

    이것은 또한 관계를 식별하는 개념에 관한 것이다. 그것은 지불의 존재를 정의 적 있다면에만 주문 존재하기 때문에, 다음 기본 키의 순서 부분을 확인하십시오.

    LineItems 테이블은 또한 자신의 자동 증가, 단일 열 기본 키가 부족합니다. 대다 테이블은 복합 기본 키의 좋은 사용의 전형적인 예이다.

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

    2.이 질문은 종교 전쟁을 생성 할 수있는 의견, 요청에 위험 가깝습니다. 고도의 자동 증가 내 테이블에 정수 기본 키를 (TablenameId이 아닌 ID로 불리는 무언가를) 가진 치우쳐 사람으로, 그것은 선택 사항입니다 한 상황이있다.

    이 질문은 종교 전쟁을 생성 할 수있는 의견, 요청에 위험 가깝습니다. 고도의 자동 증가 내 테이블에 정수 기본 키를 (TablenameId이 아닌 ID로 불리는 무언가를) 가진 치우쳐 사람으로, 그것은 선택 사항입니다 한 상황이있다.

    난 당신이 기본 키를 원하는 이유는 다른 답변이 주소 생각합니다.

    한 가지 매우 중요한 이유는 참조 용입니다. 관계형 데이터베이스에서, 실체는 수 - 이론 - 외래 키 관계를 통해 다른 개체에 의해 참조 될 수있다. 외래 키를 들어, 당신은 확실히 행을 고유하게 정의하는 하나의 열을합니다. 그렇지 않으면, 당신은 정렬 서로 다른 테이블에서 여러 열을 처리해야합니다. 이 가능하지만 복잡합니다.

    당신이 언급하는 표는 그것이 "접합"테이블 인 "실체"테이블이 아닙니다. 그것은 다 대다 관계를 처리하기위한 관계형 데이터베이스 구조입니다. 정말 엔티티를 대표하지 않기 때문에 외래 키 관계가 없어야합니다. 따라서, 복합 기본 키가 합리적이다. 그런 당신이 인공 기본 키를 떠나는 것은도 바람직하다 데이터베이스 크기에 대해 우려하는 경우와 같은 일부 상황이 있습니다.

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

    3.기본 키 (PK + 테이블 이름과 같은) 대회의 이름을 따서 명명하는 int 신원 (1,1)에 클러스터 좋은 연습하므로 디스크 공간이 저렴합니다. 그것은 쿼리, 조인, 인덱스 및 기타 제약 조건을 쉽게 관리 할 수 ​​있습니다.

    기본 키 (PK + 테이블 이름과 같은) 대회의 이름을 따서 명명하는 int 신원 (1,1)에 클러스터 좋은 연습하므로 디스크 공간이 저렴합니다. 그것은 쿼리, 조인, 인덱스 및 기타 제약 조건을 쉽게 관리 할 수 ​​있습니다.

    그러나 어떤 하나의 좋은 이유는 (적어도 MS SQL 서버에서)가 그렇게 : 당신이 기본 스토리지 시스템에서 데이터의 물리적 정렬을 관리 할 경우.

    클러스터 된 기본 키는 물리적 정렬 순서를 결정합니다. 당신은 ID 열에서 그것을 할 경우, 물리적 정렬 순서는 기본적으로 삽입 순서입니다. 그러나, 이것은 당신이 항상 테이블 같은 방법으로 쿼리 특히, 최선을하지 않을 수 있습니다. 매우 큰 테이블에 오른쪽 물리적 정렬 순서를 얻는 것은 훨씬 빨리 쿼리를합니다. 예를 들어, 당신은 두 개의 열이의 합성에 클러스터 된 인덱스를 할 수 있습니다.

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

    4.가장 좋은 방법은 최상의 도움이됩니다 만, 최악의 눈부신. 가장 좋은 방법에가는 것은 죄가 아닙니다. 그냥 당신이 종류의 트레이드 오프 당신이하고있는 것을 알 수.

    가장 좋은 방법은 최상의 도움이됩니다 만, 최악의 눈부신. 가장 좋은 방법에가는 것은 죄가 아닙니다. 그냥 당신이 종류의 트레이드 오프 당신이하고있는 것을 알 수.

    데이터베이스 엔진은 매우 일을 복잡하게 할 수있다. 특히 최적화가 주어진 엔진에 의해 만들어진 것을 모른 채, 그것을 (나는 우리가 여기에 대해 얘기하고 문제가 성능이라고 가정하기 때문에) 구조의 종류가 최상의 성능을 얻을 것입니다 어떤 결정하기 어려울 것이다. 복합 키는 데이터베이스의 한 종류에있는 큰 테이블에 대한 문제가 될 수 있지만, 서로에 대한 눈에 띄는 영향을 미칠 수 없습니다.

    내가 배운 유용한 방법은 항상 가능한 한 간단하게 내 응용 프로그램에있는을 위해 노력하는 것입니다. 삽입, 또는 다른 성가신 전에 조회를 수행 할 필요가 당신 저장 복합 키를 사용합니까? 그것을 써. 당신은, 그러나, 통지를 사용하는 응용 프로그램이 더 이상 몇 가지 중요한 성능 요구 사항을 만족하지 만드는 경우, 그들없이 솔루션을 고려한다.

  5. from https://stackoverflow.com/questions/26078535/composite-primary-keys-is-it-good-or-bad by cc-by-sa and MIT license