2011-01-18 8 views
3

SQL Server 데이터베이스에서 복합 기본 키를 사용할지 여부에 대한 철학적 토론에 어려움을 겪고 있습니다. 저는 항상 과거에 대리 키를 사용했고, 다른 것을 시도하기 위해 편안함 영역을 떠나 자신에게 도전하고 있습니다. 나는 많은 토론을 읽었으나 아직 어떤 종류의 해결책도 찾아 볼 수 없다. 내가 가지고있는 투쟁은 복합 PK로 레코드를 업데이트해야 할 때입니다.복합 기본 키 업데이트

예를 들어, 질문의 기록은 다음과 같이이다 :

ContactID, RoleID, EffectiveDate, TerminationDT 

이 경우에 PK가 (ContactID, RoleID, EffectiveDate)입니다. TerminationDT은 null 일 수 있습니다.

내 UI에있는 사용자가 RoleID을 변경 한 경우 레코드를 업데이트해야합니다. 서로 게이트 키를 사용하면 Update Table Set RoleID = 1 WHERE surrogateID = Z을 할 수 있습니다. 그러나 합성 키 방식을 사용하면 복합 키의 필드 중 하나가 변경되면 이전 레코드를 참조하여 UI의 어딘가에서 이전 값을 유지하지 않고도이를 업데이트 할 방법이 없습니다.

내 UI에 데이터 소스를 바인딩하지 않습니다. 연결을 열고 데이터를 가져 와서 양동이에 저장 한 다음 연결을 닫습니다. 모든 사람의 의견은 무엇입니까? 감사.

답변

4

"오래된 레코드"와 같은 아이디어를 참조하여 말하는 것은 관계가 복합 키 요소와 별개의 의미 론적 의미를 갖는다는 것입니다. 이전 레코드를 참조하는 키가 필요하다는 사실은 합성 키 요소가 충분하지 않다는 것을 의미합니다. 당신은 여전히 ​​외래 키를 유지하고 있지만, 여기에 기본 키가 필요하다는 것은 나에게 꽤 분명해 보입니다. 일반적인 의미에서 대리 키가 아닙니다.

제 의견으로는 대리 키를 사용하십시오.

+0

+1. IMO 기본 키는 변경 불가능해야합니다. 일단 할당하면 변경되지 않습니다. 기간. 그것이 변경되면 - 그것은 PK가 아닙니다 –

+0

이 경우 복합 PK 사용에 대한 제 생각이었습니다. 그것을 정당화 해 주셔서 감사합니다 !! – VBCSharp

1

올바른 길을 찾고 있지만 기본 키를보고있는 것이므로 normalization을 살펴 보시기 바랍니다. 난 당신이 떨어져 합성 키를 사용하여, 시도하고 필요한 경우를 제외하고 테이블 당 하나의 기본 키를 사용해보십시오. 예를 들어 RoleID를 가져 와서 자체 테이블로, 역할 설명으로, 그리고 역할을 정의하는 다른 테이블로 만들어 다른 테이블에 외래 키 참조로 넣을 수 있습니다.

그것은 당신의 테이블처럼 보이는없이, 상호 참조입니다 : 쉬운 부분

+0

나는 좀 더 명확히해야한다고 생각한다. ContactID 및 RoleID는 foriegn 키입니다. ContactID 및 RoleID는 각각 Contact 및 Role 테이블의 기본 키입니다. – VBCSharp

1

먼저? 이 경우 UI를 비롯한 다른 라이브러리에서 이해할 수 있다면 복합 키가 매우 잘 작동하는 것으로 나타났습니다. 요즘에는 많은 UI가 없으므로 사용자 인터페이스가 아닌 것처럼 들립니다. 따라서 :

1) 당신은 그게 항상 의미가있는 몇 안되는 장소 중 하나입니다,하지만, 상호 참조에 대한 복합 키를 사용하는 것이 올바른 :

2) 당신은 단지뿐만 아니라 넣을 수 있습니다 대리 키를 사용하면 코딩의 나머지 부분을 쉽게 처리 할 수 ​​있지만 은 이러한 세 개의 열에 대해 고유 한 제약 조건을 추가해야합니다..

또한 데이터베이스에는 "원거리 기본 키"가 기본적으로 지원되지 않으므로 날짜 범위에 겹침이 없는지 확인하는 검사 제약 조건이 필요할 수 있습니다.

이제는 내가 혼란스럽게 이야기하겠습니다. 이 행을 왜 업데이트하고 있습니까? 올바른 작업으로 원래 날짜에 종료 날짜를 넣고 연락처의 새 역할을 나타내는 새 행을 강제로 작성하지 않습니까?어떤 경우에는 컴포지트 및 원숭이를 UI를 약간 유지하여 특정 작업을 허용/금지 할 수 있습니다.

+0

사용자 관점에서 생각해 보면 (GASP !!), 사용자가 원래 항목을 실수로 잘못 입력했기 때문에 돌아가서 역할을 변경해야한다고 생각하십니까? 완전한 세계에서 이전 역할은 만료되고 새로운 역할은 기한 후에 시작됩니다. 사용자가 잘못된 레코드를 삭제하고 UI에서 수행 한 것으로 생각한 새로운 올바른 레코드를 입력하도록 할 수 있습니다. 날짜의 유효성 검사 (중복 없음)는 UI에서 발생합니다. – VBCSharp

+0

Hey, no GASPing 사용자를 생각할 때, 프로그래머에게 그렇게 할 수만 있다면 :) 사용자가 삭제/삽입해야하는 경우 얼마나 큰 거래인지 결정해야합니다. 모든 사용자는 빨리 변경할 수 없다는 것을 알게되고 삭제할 것입니다. 실제로 사용자베이스를 얼마나 잘 알고 있는지에 대한 귀하의 요청입니다. –

+0

@VBCSharp : "<...>의 유효성 검사가 UI에서 발생합니다."DB 데이터 무결성의 컨텍스트에서 이것을들을 때마다 매우 의심 스럽습니다. –