_대문 | 방명록 | 최근글 | 홈피소개 | 주인놈 |
FrontPage › PrimaryKey에Hash적용
|
|
[edit]
1 기본 개념 #일반적으로 키 개체집합[1]에 해당되는 것들이 구현되었을 때에 일련번호[2]로 PK[3]를 만든다. 일련번호는 대리키[4]다. 대리키를 사용하는 이유는 관계형 모델에서 하위 개체집합들과 키 개체집합 관계를 구현했을 때에 하위 개체집합들의 FK[5] 또는 PK의 일부를 구성하게 되는데에 따른 부담[6]을 줄이기 위함이다. 예를 들어 '사원'과 '부양가족'이라는 테이블이 있다고 가정해 보자. '사원'의 '사원번호'는 PK이며, 일련번호다. '부양가족'은 어떤 사원의 부양가족임을 알기 위해서 '사원'과 식별자 관계 또는 비 식별자 관계를 가지게 된다. 예를 들어 '/사원명/ 컬럼은 후보키이고, 사원 A(사원명)의 부양가족 리스트'를 조회하기 위해서는 다음과 같은 SQL 문을 사용하게 된다.
즉, 데이터의 연결을 통해서만 알 수 있는 정보가 된다. 하지만 후보키를 해시함수에 입력하고, 출력된 결과를 '사원번호'로 만든다면 이야기는 틀려진다. '사원번호'를 이와 같은 방법으로 만들었다면 위의 SQL문은 다음과 같이 변경할 수 있을 것이다.
훨씬 간단해 진다. 요즘의 DBMS는 해시함수를 지원하기 때문에 매우 빠르게 함수 처리를 할 수 있다. 구체적인 예를 들어보도록 하자.
[edit]
2 구현 예제1 #다음은 MS-SQL Server를 이용하여 구현한 예제이다.
create table customer ( hash_id int , id varchar(20) , pw varchar(16) , sitecode tinyint ); insert customer values(checksum('yasicom' + CONVERT(varchar(3), 1)), 'yasicom', '1234', 1); insert customer values(checksum('yasicom' + CONVERT(varchar(3), 2)), 'yasicom', '1234', 2); insert customer values(checksum('yasicom' + CONVERT(varchar(3), 3)), 'yasicom', '1234', 3); insert customer values(checksum('yasicom' + CONVERT(varchar(3), 4)), 'yasicom', '1234', 4); go create proc usp_customer_select @id varchar(20) , @sitecode tinyint as select * from customer where hash_id = checksum(@id + CONVERT(varchar(3), @sitecode)); go exec usp_customer_select 'yasicom', 1 exec usp_customer_select 'yasicom', 2 exec usp_customer_select 'yasicom', 3 exec usp_customer_select 'yasicom', 4 [edit]
3 구현 예제2 #create table customer ( hash_id int , id varchar(20) , pw varchar(16) ); insert customer values(checksum('yasicom'), 'yasicom', '1234'); go create proc usp_customer_select @id varchar(20) as select * from customer where hash_id = checksum(@id); go exec usp_customer_select 'yasicom' [edit]
4 장점 요약 #다음과 같은 장점을 가진다.
|
고귀한 생각과 함께 있는 자는 결코 고독한 것이 아니다. |