2009년 12월 5일 토요일

Primary Key 생성 전략 또는 방법

관계형 데이터베이스를 사용하는 환경에서는 Primary Key를 관리하는 방법이 필요하다. 특히 Multi - Thread 환경에서는 특별한 방법을 적용하지 않는다면 Primary Key Collision(충돌)을 피할 수 없다.

1. Select Max(XXX) + 1 을 Insert 시에 사용하는 방법

INSERT INTO TABLE (ID)
            VALUES (SELECT MAX(ID) + 1 FROM TABLE)

이 방법의 장점은 소스코드에서 아무런 작업을 해 줄 필요가 없다는 것이다. 그러나 단점은 현재의 추세인 OR - Mapping을 하는 환경에서는 사용할 수 없다는 점이다. DB에 저장하기 전까지 ID 값을 알수 없으며 저장한 후에도 ID 값을 알기위해서는 다시 조회하는 별도의 과정이 필요하다. 결국 Class에서 ID 값을 확인할 필요가 전혀 없는 경우에만 사용이 가능하다.

2. DB에서는 제공하는 기능을 사용하는 경우
DB에서 일련번호를 제공하는 기능을 사용하는 방법이다. IDENTITY column type을 제공하는 DB 또는 SEQUENCE 기능을 제공하는 DB를 사용할 경우에는 위에서 제공하는 기능을 이용해서 구현하면 된다. 구현 방법은 각 DB마다 조금씩 다르기는 하지만 SQL을 이용하는 간단한 방법이다.

이 방법의 장점은 생성로직을 소프트웨어 개발자가 별도로 구현할 필요가 없다는 점이다. 그러나 모든 DB가 제공하는 기능은 아니며 제공하는 방식도 약간씩은 상이해서 모든 DB를 지원해야 하는 OR Mapping Tool에는 적용하기 힘들다.

3. 테이블을 이용하는 방법
별도의 테이블을 이용하여 관리하는 방식이다. 아래와 같은 테이블을 만든 후에 Primary Key 생성로직을 별도로 구현하는 방식이다.

CREATE TABLE ID_GEN(GEN_KEY VARCHAR(10) NOT NULL,
                   GEN_VALUE INTEGER NOT NULL,
                   primary key (GEN_KEY));

이 방법의 장점은 모든 DB에 대하여 구현할 수 있다는 점이다. 단점은 위의 방법보다는 좀 복잡한 로직으로 구현을 해야 한다는 단점이 있다.

4. UUID를 이용하는 방법
 Primary에 UUID를 이용하는 방법이다. 가장 간단한 방법이다. 단점은 데이터베이스 용량을 많이 차지 한다는 문제가 있다. 그리고 위의 방법들과 다른 장점은 멀티사이트(여러 DB를 각각 사용하면서 데이터의 Primary Key는 달라야 하는 사이트)에서도 적용이 가능하다는 점이다.

댓글 없음:

댓글 쓰기