2011-04-24 7 views
3

사용자 업로드 개체 테이블이 있습니다. 각 사용자는 임의의 수의 개체를 가질 수 있습니다. 나는 각 객체과 같이, 순차적 식별자를 갖고 싶어 : 나는 OBJID에 대한 싶습니다시퀀스 필드, 기본 키/시퀀스 쌍에 대한 개별 시퀀스 추적

USERNAME OBJECTNAME OBJID 
Kerin  cat   1 
Kerin  dog   2 
Narcolepsy pie_tins  1 
Kerin  mouse   3 

이 시퀀스 수 있지만, 사용자 이름 필드마다 개별적으로 일련 번호를 추적. 먼저 DB를 쿼리하고 가장 높은 OBJID를 선택하고 그 값을 하나씩 증가시키고 내 INSERT에서이를 사용하면 일종의 정렬을 수행 할 수 있습니다. 사용자가 한 번에 두 번의 업로드를 실행하기가 어려울 수 있기 때문에 괜찮습니다. 하지만 쿼리 오버 헤드와 내가 잘못하고 있다는 느낌 때문에 더 나은 방법을 찾고 싶습니다.

+0

첫째, 기본 키가 고유해야 사용자 이름이 내 고유가 아닙니다. 둘째, OBJID가 필요한 것은 어떤 종류입니까? –

+0

내가 틀린 기본 키를 말했을 때, 나는 생각보다 분명히 피곤했습니다. 게시물이 수정되었습니다. OBJID는 객체를 명확하게 참조하는 데 사용됩니다. 이제는이 질문에 대답하려고합니다. 식별자가 순차적이어야하는 이유가 더 이상 확실하지 않습니다. 필드가 손상 될 수 있는지 확인하고 있습니다. 간단한 UUID. –

+0

이들이 순차적 일 필요가 없다면 아마도 테이블에'serial' (또는'bigserial') 타입의 PK를 추가 할 수 있습니다. 숫자는 여전히 사용자마다 고유 할 수 있지만 구현하기가 쉽지 않으며 UUID의 추악함을 가지지 않습니다. –

답변

4

순차적 일 필요가 없다면 테이블에 serial (또는 bigserial)의 PK를 추가 할 수 있습니다. 숫자는 여전히 사용자마다 고유 할 수 있지만 구현하기가 쉽지 않으며 UUID의 추악함을 가지지 않습니다.

수동으로 CREATE SEQUENCE 호출을 통해 사용자 이름 당 하나의 시퀀스를 만들 수 있습니다. 그런 다음 BEFORE INSERT trigger을 추가하여 사용할 시퀀스를 파악한 다음 nextval을 호출하여 objid을 설정할 수 있습니다. 사용자 이름이 보통 /[a-z][a-z0-9]*/ 패턴으로 제한되는 경우 시퀀스 이름을 "seq_objid_ username"과 같이 작성할 수 있으며 트리거를 사용하면 어떤 시퀀스를 사용할지 쉽게 파악할 수 있습니다. 사용자 별 시퀀스는 사용자 테이블의 INSERT 트리거에 의해 생성 될 수 있습니다. 이 접근법은 작동 할 것이고 PostgreSQL의 기존 트랜잭션 안전 시퀀스 시스템에 의존하기 때문에 안전 할 것입니다.