2012-01-19 2 views
1

이것은 프로그래밍 문제보다 더 많은 설계상의 문제입니다.열의 고유 한 조합에 대해 PK를 만들거나 숫자 rowID를 추가하려면

Name Barcode BarcodeFormat etc... 
---------------------------------------- 

(Name, Barcode, BarcodeFormat) 고유 테이블 (후보 키)의 레코드를 식별 할 세 개의 열이 있습니다

이 나는 ​​소매 제품에 대한 세부 정보를 저장하는 테이블이있다. 그러나이 테이블에는 FK가 필요한 다른 테이블이 있습니다. 그래서 나는 auto_incrementitemId을 소개하고 그것을 만들었습니다.

내 질문은 - 내가 (itemId, Name, Barcode, BarcodeFormat)PK을해야하거나 PK(itemId)UNIQUE(Name, Barcode, BarcodeFormat)이 더 좋을 것입니다.

내 관심사는 INSERTSELECT 운영 측면에서의 성능이지만 크기에 대한 의견도 환영합니다. PK (해당 itemId)와 UNIQUE (이름, 바코드, BarcodeFormat) :

나는 mysql 확실히

답변

5

와 함께 innodb 테이블을 사용하고 있습니다.

  • 는 당신을위한 여러 부분으로 키를 사용하는 번거 로움을 원하지 않는 모든 조인 등 당신은 일일 행을 다음 고유하지 않습니다 바코드 값없이 을 가질 수있다
  • , 당신 때문에 돈 고유성에 대한 제약 조건은 데이터베이스 엔티티가 아닌 비즈니스 수준의 문제입니다. 사용자는 항상 키가 필요합니다. 하지만 고유성의 비즈니스 규칙이 항상 필요한 것은 아닙니다.
+0

좋아하는 ...... ...... –

+0

-1 '기본 키'의 선택은 임의적입니다.마지막으로 요점은 특히 혼란 스럽습니다. 무결성 제약 조건은 비즈니스 규칙 데이터베이스의 논리적 표현이어야합니다. 그들이 아니라면 당신은 심각하게 잘못된 것을하고 있습니다! – onedaywhen

+0

@onedaywhen 내 의견을 완전히 놓쳤습니다. 독창적 인 조합은 비즈니스 * 중심 개념이므로 ** 비즈니스 요구가 변화함에 따라 ** 언제든지 변경 될 수 있습니다 ** (고유 한 제약 조건을 깨뜨릴 수있는 바코드가없는 제품의 완벽하게 합당한 예처럼). 그러나 기본 키의 필요성은 * 영구 *이므로 고유 제한 조건의 필요성보다 오래 남아있을 수 있습니다. 두 가지를 분리하면 융통성과 유지 보수성이 향상됩니다. 두 가지를 병합하면 데이타베이스 요구 사항을 현재의 비즈니스 요구 사항에 맞추게됩니다 (비즈니스가 바뀌지 않기를 바랄뿐입니다). – Bohemian

2

수백만 개의 제품이 있거나 매우 높은 처리량 요구 사항이 없으면 성능 측면에서 그다지 차이가 ​​없습니다.

비즈니스 키가 변경되면 관리하기가 더 쉽기 때문에 surrogate PK (예 : 자동 증가 열, 두 번째 옵션 인 PK(itemId)UNIQUE(Name, Barcode, BarcodeFormat))를 사용하는 것이 좋습니다.

0

itemId를 이미 추가 한 경우이를 PK로 사용하고 다른 세 열에는 고유를 사용해야합니다.

itemId가 없으면 다른 열을 PK로 사용할 수 있지만 모든 곳에서 유지하기가 어려울 수 있습니다. 이 경우 그것은 엔티티이므로 제품에 ID가 있어야하기 때문에 훌륭하지는 않습니다. 다만 관계가있는 경우 ID 열을 가지지 않아도됩니다.

1

두 개의 개의 후보 키가 있습니다. 우리는 3 열 복합 키를 '자연 키'라고하고 auto_increment 열 (이 경우)은 '대리 키'라고합니다. 둘 다 데이터베이스 레벨에서 고유 한 제한 조건 (논리적을 나타 내기 위해 소문자에서 '고유')이 필요합니다. 선택적으로, 하나의 후보 키는 '1 차'로 지정 될 수있다. 이 지정을 가져올 키 (있는 경우)를 선택하는 것은 임의적입니다. 이 문제에 관해 당신에게 확실한 조언을 해주는 사람을 조심하십시오!

관련 문제