복붙노트

[SQL] 나는 복합 기본 키 여부를 사용해야합니까?

SQL

나는 복합 기본 키 여부를 사용해야합니까?

전용 (EmbeddedId 또는 IdClass 주석을 통해) 자바의 JPA 복합 데이터베이스 키의 2 수준의 지원이있는 것 같습니다. 나는 언어에 상관없이, 복합 키를 읽을 때, 사람들은 그들에게 나쁜 일 것으로 걸쳐 계속오고. 그러나 나는 이유를 이해할 수 없다. 복합 키는이 일을 계속 사용할 허용 있습니까? 그렇지 않다면, 왜?

나는 나와 함께 동의 한 사람을 발견했습니다 : http://weblogs.sqlteam.com/jeffs/archive/2007/08/23/composite_primary_keys.aspx

그러나 다른 사람은하지 않습니다 : http://weblogs.java.net/blog/bleonard/archive/2006/11/using_composite.html

그것이 그냥 날, 또는있는 복합 키가 적절 여부 곳의 구분을 할 수없는 사람? 그것은 표 가입 나타내는 경우, 즉 - 테이블 엔티티를 나타내지 않는 경우 I 복합 기본 키 유용한 참조.

간단한 예 :

배우 {ID, 이름, 이메일} 영화 {ID, 이름, 연도} 문자 {ID, 이름} 역할 {배우, 영화, 문자}

여기에 배우, 영화 및 캐릭터 분명히 기본 키와 같은 ID 열을 가지고 혜택을 누릴 수 있습니다.

그러나 역할은 다 대다 테이블을 조인. 난 그냥 데이터베이스에 행을 식별하는 ID를 만드는 어떤 점을 볼 수 없습니다. 나에게 기본 키가 {배우, 영화, 문자}임을 분명 보인다. 기본 키 순서가 0으로 감싸는 일단 그것은 또한의 데이터가 테이블에 모든 시간을 변경 가입 특히, 다소 제한 기능 것 같아, 당신은 기본 키 충돌로 자신을 찾을 수 있습니다.

그래서, 원래의 질문에 다시, 그것은 복합 기본 키를 사용하도록 허용 연습은 아직? 그렇지 않다면, 왜?

해결법

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

    1.나는 복합 키를 사용하여 아무 문제가 없다 생각합니다.

    나는 복합 키를 사용하여 아무 문제가 없다 생각합니다.

    나 데이터베이스에 우리가 대접 코드 같은 방식으로 취급되어야한다 자체의 구성 요소입니다 : 예를 들어 우리가 깨끗한 코드를 원하는, 즉 통신하는 명확하게 의도 한 일을하고 추가하지 않는, 잘 않는 복잡도의 레벨 uneeded 등

    약동학 복합의 경우 모델이 맑고 깨끗한 유지해야하므로 DB와 같은 일이, 이것은 현실이다. 복합 PK는 믹스 자동 증가 + 제약 조건보다 명확합니다. 당신은 당신이 진짜 PK 무엇을 요청해야 아무것도 안하는 ID 열을 볼 때, 당신은 등 명확한 PK는 의심을 두지 않습니다 알고 있어야한다는 다른 숨겨진 것이있다.

    DB를 나에게 우리가 가질 수있는 가장 견고한 기반을 필요로 앱의 기본이다. 이 기본에 우리는 응용 프로그램 (웹 또는하지를) 만들 수 있습니다. 우리가 하나의 개발 툴 / 프레임 워크 / 언어의 일부 특정을 준수하기 위해 DB 모델을 구부리해야하는 이유를 나는 볼 수 있습니다. 데이터는 응용 프로그램, 주변이 아닌 다른 방법을 지시한다. 무엇 ORM 다른 모델을 부과 더 나은 솔루션이 나타납니다 앞으로 변경하고 쓸모가되어있는 경우? 우리는 이런 저런 프레임 워크에 맞게 DB 모델을 재생할 수 없습니다, 동일하게 유지해야하는 모델은 우리가 데이터에 액세스하는 데 사용하는 어떤 도구에 의존해서는 안 ...

    기능이 변경 되었기 때문에 향후 DB 모델 변경하면 변경해야합니다. 우리는이 기능이 어떻게 변경되는지 오늘을 알고 싶다면, 우리는 이미이 모델링됩니다. 그리고 향후 변경이 때가되면 처리됩니다, 우리는 그렇게 하나의 여분의 열이 미래의 변화를 withold 것이라는 점을 보장하지 않는, 예를 들어 기존 데이터에 미치는 영향을 예측할 수 없습니다 ...

    우리는이 변화에 쉽게 될 것입니다 이런 식으로 오늘의 기능을 설계하고, 가장 간단한 DB를 모델을 유지해야 / 미래에 진화.

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

    2.제 개인적인 의견으로는 당신으로 인해 몇 가지 이유에 복합 기본 키를 피해야한다 :

    제 개인적인 의견으로는 당신으로 인해 몇 가지 이유에 복합 기본 키를 피해야한다 :

    이 다른 이유가 있지만 이들은 몇 가지 있습니다.

    내가 물어 보곤 주요 질문은 당신이 분야의 독특한이있는 경우 별도의 기본 키를 사용하지 왜? 비용은 무엇입니까? 추가 정수 인덱스? 그것도 나쁘지 않다.

    희망이 도움이.

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

    3.비슷한 질문을 SO에 요구하고, 합의가되지 않았다)

    비슷한 질문을 SO에 요구하고, 합의가되지 않았다)

    웹 응용 프로그램을 개발하는 경우 그들은 당신의 URL을 간단하게, 당신은, 단일 열 PK 년대를 사랑합니다.

    시퀀스는 64 비트 PK의 2 억 개 단일 테이블의 레코드 (32 비트) 또는 10 ^ 18 필요할 것 포장하는.

    BTW, 데이터 모델은 알 수없는 배우와 영화 문자를 허용하지 않습니다.

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

    4.내 일반적인 의견은 아니 ...입니다. 복합 기본 키를 사용하지 마십시오.

    내 일반적인 의견은 아니 ...입니다. 복합 기본 키를 사용하지 마십시오.

    그들은 일반적으로 복잡한으로 ORMs은 당신이 그들을 사용하는 경우 (ORM들을 가끔 복합 기본 키 "기존 동작을"전화로 지금까지 이동) 일반적으로 여러 개의 키를 사용하는 경우, 하나 이상의 그들보다는 기술적 인 키보다는 자연적인 경향이됩니다 나를 위해 더 큰 문제이다 : 이럴 당신은 확실히 기술 기본 키를 선호한다.

    보기에 데이터베이스 개발 실수에 AppDevelopers에 의해 이루어집니다.

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

    5.종교 전쟁은이 주제에 일어나고,왔다, 그리고 여전히있다.

    종교 전쟁은이 주제에 일어나고,왔다, 그리고 여전히있다.

    OO 사람들은 "정체성"에 대한이 열심 일을 가지고 있고, 당신에게 말할 것이다 문제는 실제 "키"실제 객체를 "확인"을 "복합, 프로그램 내에서 그"당신을위한 능력이있는 유일한 것은 그 목표를 달성하려고하는 경우에만 문제로 당신을 얻을 것이다.

    데이터 사람들은 OO 측에서 "열심"로 인식되는 '고유성'에 대한이 일이 있고, 유일한 문제 즉 당신을 말할 것이다 그 사업을 할 것을 요구하면 그 (값) 속성 X와 속성의 조합 Y는 고유해야합니다, 데이터베이스가 결합 된 X + Y의 고유성이 비즈니스 규칙을 적용하는 것이 그것을 볼 수있는 작업입니다.

    어떻게 귀하의 질문에 답변을 원하는 것은 당신이 선호하는 종교의 문제이다. 내 개인적인 종교는 데이터입니다. 그 종교는 어떤 과대 광고 살아남을 1969 년부터 지금까지 추세 할 수 입증되었습니다.

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

    6.그것은 종교적인 일입니다. 나는 자연 키와 피하다 대리를 사용합니다. 나는 이론 또는 관행에 컴포지트 키 아무 문제가 없습니다.

    그것은 종교적인 일입니다. 나는 자연 키와 피하다 대리를 사용합니다. 나는 이론 또는 관행에 컴포지트 키 아무 문제가 없습니다.

    만 가장 사소한 논리적 모델은 더 복합 키를 포함하지 않을 것이다. 게으른 전화 해하지만 난 구현에 물리적 모델로 대리를 도입하여 데이터 모델을 복잡하게 할 필요를 볼 수 없습니다. 물론, 성능 문제가 발견 된 경우, 나는 테이블에 하나를 생각 하는데요하지만 비정규 즉 최후의 수단으로와 동일한 접근 방식을. 습관적으로 IMO, 조기 최적화에 대리 금액을 사용.

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

    7.레일에 루비에서 명시 적으로 지정하지 않을 경우, 귀하의 역할 테이블 종류 (열이 실제로 다른 테이블에서 ID가있는 경우) 설명처럼 될 것입니다. 하지만 데이터베이스에 당신은 당신의 쿼리를 최적화하는 데이터베이스를 돕기 위해 경우에만, 그 세 열에 고유 인덱스를 정의하여 고유 한 조합을 확인 할 수 있습니다. 대신에 그 고유 인덱스 및 다른 기본 키 어쨌든을 사용하지 않는 프레임 워크로, 당신의 역할 테이블에 추가 숫자 기본 키에 대한 필요가 없습니다. 가지는 고유 인덱스가 매우 대신 복합 기본 키로 정의 할 수 수 있다고 말했다.

    레일에 루비에서 명시 적으로 지정하지 않을 경우, 귀하의 역할 테이블 종류 (열이 실제로 다른 테이블에서 ID가있는 경우) 설명처럼 될 것입니다. 하지만 데이터베이스에 당신은 당신의 쿼리를 최적화하는 데이터베이스를 돕기 위해 경우에만, 그 세 열에 고유 인덱스를 정의하여 고유 한 조합을 확인 할 수 있습니다. 대신에 그 고유 인덱스 및 다른 기본 키 어쨌든을 사용하지 않는 프레임 워크로, 당신의 역할 테이블에 추가 숫자 기본 키에 대한 필요가 없습니다. 가지는 고유 인덱스가 매우 대신 복합 기본 키로 정의 할 수 수 있다고 말했다.

    미래의 변화에 ​​관해서는 : 예기치 않은 데이터를 방지 할 수 있습니다 첫 번째 반복에 대해 엄격한 데이터베이스를 정의하는 것은 마이그레이션이 훨씬 쉽게 할, 지속한다.

    그래서 : 나는 복합 기본 키를 사용합니다.

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

    8.나는 오직 그들에 테이블을 조인을 사용합니다. 절대적으로 모든 레코드 식별자가 독특하고 시간이 지남에 일관성이 있는지 확인하는 유일한 방법은 합성 키를 사용하는 것입니다.

    나는 오직 그들에 테이블을 조인을 사용합니다. 절대적으로 모든 레코드 식별자가 독특하고 시간이 지남에 일관성이 있는지 확인하는 유일한 방법은 합성 키를 사용하는 것입니다.

    복합 키는 사용에 유혹되는 이유는 이론에 확인을 보이지만, 실제로는 그들은 일반적으로 데이터 모델에 결함이 있음을 나타내는 것으로 나타났습니다. 더 나쁜 것은, 많은 경우에 그들은 충분히 큰 데이터 세트를 제공, 보증 고유성에 실패합니다. 그리고 데이터 세트는 항상 응용 프로그램이 잠시 동안 생산 사용되었습니다 경우에만 폭발 응용 프로그램에 폭탄을 설치 한 것을 의미들을 이용하여, 시간이 지남에 따라 성장한다.

    난 그 사람들이으로 ORMs을 underplaying 생각합니다. 모든 주류 프로그래밍 언어는 사실상 ORM을 가지고 있으며, 그들이 OO와 관계형 구조 사이의 근본적인 호환성 문제를 해결하기 때문에, 년 동안했다. ORM없이 SQL 데이터베이스에 대해 복잡한, 검증 OO 소프트웨어를 작성하는 시도는 최선을 매우 비효율적이다.

    좋은으로 ORMs는 또한 평균, 팀은 ORM 작업에 의해 앞서서 잘 나올 것입니다, 그것은 훨씬 쉽게 만들 수 있도록하고 일관성있는 고품질의 데이터베이스 스키마를 유지하는 방법과 도구를 제공합니다. 스키마를 수작업 오히려 ++ ... 사람들이 그것을 할 수 있습니다 C를 작성 유사하지만 현실 세계에서의 평균 제품이 좋은 아니라고 시간이 지남에 따라 품질을 유지하기 위해 매우 어렵다.

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

    9.그것이 montonically없는 경우보다, (당신은 귀하의 질문에 언급 같은) 테이블에 가입 다른 나타낼 때 - 즉, 도메인 모델의 측면에서, 나는 테이블의 엔티티를 표현하지 않는 경우 복합 기본 키를 만드는 아무것도 잘못된 참조 증가, 당신은 삽입시 페이지 분할의 일정 금액을 받게됩니다.

    그것이 montonically없는 경우보다, (당신은 귀하의 질문에 언급 같은) 테이블에 가입 다른 나타낼 때 - 즉, 도메인 모델의 측면에서, 나는 테이블의 엔티티를 표현하지 않는 경우 복합 기본 키를 만드는 아무것도 잘못된 참조 증가, 당신은 삽입시 페이지 분할의 일정 금액을 받게됩니다.

    일부 ORM 년대 그래서 아마도 기본 키에 대한 대리 자동 정수를 만들 안전, 복합 기본 키에 잘 대처하고, 클러스터되지 않은 인덱스 열을 포함하지 않습니다.

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

    10.나는 거의 (두 대용 키들로 구성된 테이블에 합류, 예외) 복합 키 좋은 아이디어였다 경우를 본 적이 없다. 처음에 위치에있는 당신은 자식 테이블에 공간을 낭비하고있다. 정수 훨씬 빠르게 일반적으로 조인으로 조인에서 당신은 성능을 해치지있다. clusterd 인덱스를 사용하는 모두 - 당신은 (여기에 SQL 서버 이야기) 클러스터 된 인덱스와 복합 키가있는 경우에, 당신은 데이터베이스가 저장 레코드에 대한 효율성이 떨어 및 기타 인덱스를 구축 덜 효율적 원인이된다.

    나는 거의 (두 대용 키들로 구성된 테이블에 합류, 예외) 복합 키 좋은 아이디어였다 경우를 본 적이 없다. 처음에 위치에있는 당신은 자식 테이블에 공간을 낭비하고있다. 정수 훨씬 빠르게 일반적으로 조인으로 조인에서 당신은 성능을 해치지있다. clusterd 인덱스를 사용하는 모두 - 당신은 (여기에 SQL 서버 이야기) 클러스터 된 인덱스와 복합 키가있는 경우에, 당신은 데이터베이스가 저장 레코드에 대한 효율성이 떨어 및 기타 인덱스를 구축 덜 효율적 원인이된다.

    때 키의 데이터가 변경 (거의 불가피 하겠지만) 당신은 잘 대규모 불필요한 업데이트를 casuing 데이터베이스가 surrogaste 키를 사용하여 설계 할 때 완전히 uneeded하는 작업에 처리 능력을 낭비하는 모든 관련 테이블을 업데이트해야합니다. 기본 키는 고유해야하지만 변하지 할뿐만 아니라 필요가있다. 복합 키는 종종 두 번째 테스트를 실패합니다.

    당신이 피해 성능, 메모리 및 데이터베이스 스토리지의 가난한 사용을 유발하는 기술을 사용하여 생각하고 그래서, 자식 레코드의 방법으로 더 많은 공간 (자원의 또 다른 낭비를) 사용하고 사물의 변화 자식 레코드의 수백만 될 것인가의 고통스러운 업데이트가 필요합니다. 그리고 이는 열심히 ORM을 사용할 수 있도록 수 있는가? 왜 그런 짓을 했을까? 당신이 대리 키를 넣어 너무 게으른하고 잠재적 인 복합 키에 고유 인덱스를 정의하기 때문에? 복합 인덱스를 사용하는 모든에 어떤 이득이 있는가? 당신이 영구적으로 데이터베이스를 훼손하는 일의 5 분 부족을?

  11. from https://stackoverflow.com/questions/963809/should-i-use-composite-primary-keys-or-not by cc-by-sa and MIT license