2009-09-14 5 views
0

아래에 정의 된 두 개의 테이블이 있습니다.인덱싱 및 외래 키

Create table tickets (id long not null, 
reseller long not null, 
constraint pk_lock primary key (id)); 

Create table ticketRegistrations (id long not null, 
customer long not null, 
constraint fkTicketRegistrationTicket 
    foreign key (id) references tickets (id) on update cascade); 

클라이언트는 티켓을 입력 할 수 있습니다 (따라서 기본 키에 대한 자동 증가 없음). id는 ticketregistrations 테이블의 Primary 키와 FOREIGN KEY이므로 무결성 제약 조건과 모든 재즈가 있습니다. 내가 겪은 문제점은 티켓 ID (즉, 00070)로 0을 채우는 것을 허용하는 기능 요청입니다. 이제 정수는 제 지식이 담긴 제로 패딩으로 저장 될 수 없습니다.

내가 해결할 수있는 해결책은 ticketID varchar (8) not column을 티켓 테이블에 추가하고 두 테이블 모두에 대한 실제 ID를 서로 게이트 키로 사용하는 것입니다. 티켓 등록 테이블의 외래 키는 티켓 ID를 가리킨다.

내가 가진 질문은 효율성과 속도에 관한 것입니다. 이전에는 시스템 내에 티켓 등록을 추가 할 수 있었고 데이터베이스는 추가시 무결성 제약 조건을 수행하여 동일한 ID를 가진 티켓이 데이터베이스 내에 있는지 확인했습니다. 이제 색인이 생성 될 ID에 대한 varchar 문자열이 생겼습니다.
고객이 티켓을 등록하면 티켓 표에서 ticketid varchar를 유지하고 ticketregistration 테이블 (또한 varchar (8)) 내에서 ticketid의 외래 키를 사용하는 것이 더 쉬울까요?

ticketregistrations 내에 ticketidvarchar (8)가 없으면 ticketregistrations 테이블의 기본 키로서 외래 키를 티켓 테이블에 보관하고 티켓 테이블 내의 ticketid를 먼저 확인하여 값을 검색하십시오 , ticketregistrations 내의 행에 그것을 입력?

이렇게하면 ticketsregistrations 테이블에 삽입하기 전에 티켓 테이블에서 인덱스 된 varchar 검색이 만들어집니다.

내 초기 솔루션은 참조 무결성이 문제를 처리 했으므로 필요하지 않았습니다.

검색 시간이 걱정됩니다.

+0

어떤 데이터베이스 시스템입니까? –

답변

1

두 가지 해결책이 있습니다.

첫 번째는 티켓 테이블의 식별자에 대해 두 개의 열을 갖는 것입니다. 하나는 참조 용으로 사용되는 내부 전용 식별자 여야합니다 (자동 증가시킬 수 있음을 의미). 핵심은이 열이 입력 데이터에 연결되지 않는다는 것입니다. 두 번째 열은 사용자가 입력 한 ID의 문자열 표현을 포함합니다. 검색을 위해 두 번째 열에 고유 색인을 추가 할 수 있습니다.

두 번째는 표를 그대로 유지하는 것입니다. 단 은 0으로 채워진 ID가 지정된 길이 (즉, 사용자가 6 자리 만 입력 할 수 있음)로 표시됩니다. 따라서 어디에서나 ID를 표시해야하는 경우에는 ID를 패드하는 함수를 호출하십시오. 티켓 번호가 입력되면 패딩을 제거하고 정수로 변환합니다. 이 솔루션은 질문에 데이터베이스 구조 주위에 이미 전체 응용 프로그램을 작성한 경우 쉽게 구현할 수 있습니다. 응용 프로그램의 수명 동안 숫자가 변수가 될 것이라고 생각하면 더욱 유연합니다.

가능한 경우 두 가지 솔루션을 모두 구현하고 표에 두 번째 숫자 열을 추가 한 다음 제로 패딩 표시 작업을 수행 할 수 있습니다.

어떤 솔루션을 사용하든 문자와 숫자가 포함 된 티켓 식별자에 대한 지원을 추가하라는 메시지가 표시되면 변경해야 할 사항에 대해 생각해보십시오.

0

ID와 외부 제약을 그대로 둡니다. varchar 인 두 번째 계산 열을 추가하고 앞에 0을 추가하십시오. 모든 작업에 첫 번째 열을 사용하고 두 번째 열을 표시하십시오.