2011-10-24 3 views
0

데이터베이스 스키마에 처음 사용 (SQLite 사용 계획). 그런데, 나는 데이터베이스가 현재 내 테이블의 대부분에 나타나는 복합 키 (3 열)를 포함하고 있기 때문에 서로 게이트 키 사용에 대해 생각하고있다. 고유 키에 대한 3 열과 몇 가지 정보가 포함 된 하나의 열을 포함하는 여러 테이블이 있습니다. 나는 또한 하나의 테이블에 고유 키를위한 3 열과 외래 키 (많은 부모)와 같은 3 열을 포함합니다. 이러한 모든 테이블을 단일 테이블로 결합하는 것은 많은 빈 필드가 있기 때문에 의미가없는 것처럼 보입니다.대리 키 대 복합 키

하나를 선택하면 어떤 피트가 떨어지나요? 일반적으로 프로그래밍에 더 편리한 것으로 간주되는 것은 어느 것입니까?

미리 감사드립니다.

답변

4

각 기술에는 장단점이 있습니다.

일반적으로 단일 대리 키 열만 참조하면 SQL 문과 JOIN을 작성하는 것이 더 쉽습니다. 또한 데이터베이스의 크기를 상당히 줄입니다.

반면에 서로 게이트 키를 사용하면 대용 키의 일부인 정보를 검색하기 위해 JOIN에 적어도 하나의 추가 테이블을 추가해야하는 경우가 있습니다. 대용 키의

두 개의 추가 장점 :

  1. 많은 프레임 워크 정수 기본 키 필드의 사용을 필요로 .

  2. 어떤 종류의 사용자 인터페이스 컨트롤 (예 : 웹 페이지의 입력)에 레코드를 바인딩하는 경우, 인코딩 및 디코딩보다 식별 목적으로 컨트롤에 단일 값을 첨부하는 것이 훨씬 쉽습니다 여러 열.

+0

왜 자동 증분 PK와 대리 키를 후보 키로 사용할 때 다른 테이블을 추가합니까? SQLite *는 항상 "int PK"라는 ROWID를 제공하지만, 단 하나의 "PK"는 포기하고 포기했습니다. 그러나 정보는 적절한 제약 조건을 가진 모델에서 여전히 인코딩 될 수 있습니다. 삽입시 조각화를 줄이는 관점에서 "저렴"할 수있는 다른 [후보/덮개] 색인의 "비용". 후보 인덱스가 테이블을 비정규 화하는 경우 [대리] PK가 시작될 올바른 후보가 아닙니다. –

+2

제품, 하위 어셈블리, 구성 요소가있는 BOM. 하위 어셈블리 (ProductID, AssemblyName)는 고유합니다. 이것을 Component와 PK로 사용하면 Component 만 사용하여 Product by Component 사용을 찾을 수 있습니다. 대신 대리 정수 기본 키를 사용하는 경우 해당 정보를 얻으려면 하위 어셈블리에 가입 (또는 하위 쿼리 기술 사용)해야합니다. –

+0

간결한 답변 주셔서 감사합니다. 대부분의 쿼리가 키 (예 : 점수와 같은 속성)를 기반으로하지 않기 때문에 대리모가 더 매력적입니다. 데이터베이스 및 편집 작업이 더 많은 작업처럼 보이지만 쿼리가 오래 걸릴 수 있습니다. – jobobo