2010-03-29 2 views
0

나는 3 개의 분야를 가진 테이블이있다 : 색깔, 과일, 날짜. 과일 1 개와 색상 1 개를 골라야하지만 매일 한 번만 할 수 있습니다.데이터베이스 테이블 디자인 대 사용 편의성. (복합 PKs?)

예 :

  1. 빨강, 사과, 월요일
  2. 빨간색, 망고, 월요일
  3. 블루, 애플, 월요일
  4. 블루, 망고, 월요일
  5. 빨강, 사과, 화요일

내가 테이블을 만들 수있는 두 가지 방법은 다음과 같습니다.

1. 색상, 과일 및 날짜가 복합 기본 키 (PK)가되도록하십시오. 이렇게하면 필요한 모든 유효성 검증이 데이터베이스에 의해 수행되기 때문에 테이블에 데이터를 쉽게 삽입 할 수 있습니다.

  • PK 색상
  • PK 과일
  • PK 날짜

2 .-하고 ID 열 PK로 설정하고 다른 모든 필드. 복합 PKS가 악하기 때문에 많은 사람들이 그렇게해야한다고 말합니다. 예를 들어, CakePHP는 그들을 지원하지 않습니다.

  • PK 아이디
  • 색상
  • 과일

모두 장점을 가지고

  • 날짜입니다. '더 나은'접근법은 어느 것입니까?

  • +0

    중복 : http://stackoverflow.com/questions/1823685/database-when-should-i-use-a-composite-index – ChristopheD

    답변

    3

    실제로 "보조"기본 키로 ID 열과 함께 두 번째 옵션을 선호합니다.대부분의 데이터베이스 전문가는 아마도 테이블에서 "합성 키가 될 수있는"자연의 키를 찾아야한다고 말했 겠지만, 특히 ORM을 사용할 때 단일 열의 대리 PK로 작업하는 것이 더 쉽다고 생각합니다. ORM이 복합 키를 지원하더라도 대리 키로 작업하는 것이 더 쉽습니다. 복합 키가 아닌 ID를 사용하는 테이블에 대해 쿼리를 작성하는 것이 더 쉽습니다.

    고유 한 제약 조건을 사용하여 이러한 세 가지 고유성에 대한 데이터베이스 내 유효성 검사를 수행 할 수 있습니다.

    +0

    PK + 고유 색인 (색, 과일, 날짜) – givanse

    2

    "최상의"접근법은 # 2입니다.

    왜? "합성 PK는 악"입니다. 그들은 일반적으로별로 도움이되지 않습니다. 프로세서가 작고 디스크가 작으며 각 인덱스가 소중했던 날부터 보류가되었습니다. 세 개의 열과 별도의 서로 게이트 기본 키에 대한 고유 인덱스 제약 조건을 갖는 것이 더 간단합니다.

    또한 별도의 서로 게이트 PK가있을 때 데이터의 참조 무결성을 방해하지 않고 모든 데이터를 업데이트 할 수 있습니다.

    이미 알았으므로이 질문을 게시하는 이유는 무엇입니까?

    +0

    그게 내가 CakePHP에 대해 읽는 동안 내가 PKs에 대해 읽은 것이다. 나는 아직 그들에 대해 서 있지 않습니다. – givanse

    1

    복합 PK를 지원하는 ORM/프레임 워크를 사용하는 경우 (아무 것도 포함하지 않음) 다른 테이블에서 FK로 만들 필요가없는 경우 복합 PK를 사용하십시오. 그렇지 않으면 autoinc PK를 사용하고 다른 필드의 합성 고유 키를 작성하십시오.

    2

    두 번째 예제의 세 가지 on-PKey 열에 고유 인덱스를 설정하여 동일한 종류의 고유성 유효성 검사를 "강제 적용"할 수 있습니다. 예 : 세 필드를 모두 보유하고 고유하게 설정하는 색인을 작성하십시오. (해당 색인에 pkey를 포함하지 마십시오!)

    관련 문제