2014-05-19 2 views
0

매주 고객 데이터 변경 사항을 추적하는 표가있는 시스템이 제공되었습니다. 매주 레코드는 customer_id와 연관된 action_id와 함께 새로운 file_id 번호를 생성합니다. 이는 update 'U'가됩니다. 다음 기본 키가 있습니다.기본 키 모범 사례 제거

ALTER TABLE t_customer_file 
ADD CONSTRAINT CUSTF_PK PRIMARY KEY (file_id, customer_id, action_id); 

고객 업데이트가 일주일에 두 번 나타날 수 있도록 변경되었습니다. 따라서 file_id, customer_id 및 action_id는 같아 지므로 기본 키가이 테이블을 채우는 데 실패합니다.

그래서 새로운 기본 키를 제거하고 기본 키를 사용하지 않는 것이 가장 좋습니다.

현재 기본 키를 삭제했습니다. 그런 다음 같은 이름의 동일한 필드 대신 색인을 붙입니다. 더 많은 열이있는 새로운 기본 키를 만들 겠지만 테이블에는 단 5 개의 열만 있습니다. 각 열은 업데이트 된 데이터 만 포함합니다. 다음은 중복 된 행을 얻기 위해 수행 한 작업이며, t_customer_file의 데이터를 사용하는보기를 컴파일했습니다.

alter table t_customer_file 
drop constraint CUSTF_PK 
drop index; 

create index CUSTF_PK on t_customer_file (file_id,customer_id,action_id); 

alter view customer_file compile; 

이 시나리오의 우수 사례에 대한 도움이 될 것입니다.

+1

변경 사항이 발생한 날짜가 포함 된 다른 열, 예를 들어'change_date '를 만들어야하는 것처럼 들립니다. 그런 다음 기본 키'file_id, customer_id, action_id, change_date '를 만드십시오. 일주일에 두 번의 변경 사항이있는 경우 현재 어떤 작업이 먼저 발생했는지 모릅니다. –

+0

@ElectricLlama : 타임 스탬프는 날짜보다 좋을 수도 있습니다. –

+0

아마도. 나는 원래의 포스터를 남겨두고 그것을 반추한다. –

답변

0

"id"를 기본 키로 추가하고 은 file_id, customer_id 및 action_id 조합에 대해 여러 레코드를 허용하도록 응용 프로그램 논리를 변경합니다. file_id, customer_id 및 action_id에 대한 색인을 추가하는 것이 좋습니다. 과거 stackoverflow에서 얻은 좋은 충고는 모든 테이블에 응용 프로그램 데이터를 나타내지 않는 기본 키가 있어야한다는 것입니다. 따라서 새 기본 키 열 "id"(그 목적은 열을 고유하게 만드는 것임)를 추가하는 것이 좋습니다.

alter table t_customer_file add (id number(22) primary key) 

이 새 ID로 정렬하거나 위 주석에 언급 된 날짜/시간 소인 열을 추가 할 수 있습니다.

+0

* "그 대신 새로운 기본 키 열"id "(그 목적이 열을 고유하게 만드는 것임)를 추가하는 것이 좋습니다."* 기본 키 제약 조건과 매우 유사한 중복 데이터를 허용하는 것을 제외하고는 방지하기 위해. –

+1

나는 그것이 최선의 방법이라는 데 동의하지 않는다. 디자이너가 진정한 비즈니스 키가 무엇인지 알아 내려고 노력하지 않아서 때때로 게으르다. –

+0

@ MikeSherrill'CatRecall '그것은 관점에서 다릅니다. "file_id + customer_id + action_id"의 ​​조합은 더 이상 고유하지 않습니다. 새로운 "id"열을 추가하면 고유합니다. 동일한 "file_id + customer_id + action_id"조합을 가진 여러 레코드를 예상하도록 응용 프로그램 논리를 변경해야합니다. –