database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Q&A 6745 게시물 읽기
No. 6745
중복아이디 생성
작성자
초보(hullari27)
작성일
2006-06-15 16:15ⓒ
2006-06-15 16:16ⓜ
조회수
3,826

안녕하세요.

풀리지 않는 문제가 있어서 문의드립니다.

 

현재 데이터에 고유한 번호를 생성해서 작성하는것을 만들고 있습니다.

 

문제는 일반 게시판처럼 모든 데이터를 입력하고 마지막 인서트 할때 최대값을 생성하는 것이 아니라 등록 페이지를 열때 테이블의 최대값을 불어와야 한다는 점입니다.

 

1.만약 A라는 유저가 등록페이지를 열면 테이블의 최대값에서 +1한 4라는 값을 등록화면에 보여주고 데이터를 등록하는 중이라고 한다면

2. 아직까지도 테이블의 최대값은 3이므로 또다른 유저B가 등록페이지를 열때 역시 똑같은 번호 4를 보여주게 될것입니다.

3.즉, 중복 아이디가 여러개 생길수 있는 가능성이 있기 때문에 또다른 번호 생성 테이블을 만들어서

최대값을 불러오려 합니다.

4. 근데 만약 A라는 유저가 등록페이지를 열고 4라는 아이디를 생성하고 번호 생성 테이블에 최대값을 UPDATE합니다.

5.B라는 유저가 등록페이지를 열때 번호 생성 테이블에서 최대값을 불러오면 5번이라는 번호를 가지게 됩니다.

 

그러나 문제는 A건 B건 등록을 취소하고 나갈때에는 비어있는 번호가 생긴다는 것입니다.

무분별하게 등록페이지를 눌러 번호를 부여받고 글쓰기를 취소한다면 같은 아이디가 조회수를 클릭해서 올리는것처럼 최대값이 매우 커질 것입니다.

 

아직 초보라 그런지 어떻게 해결해야 할지 모르겠습니다.

등록할때 보여주는 아이디는 XXX_00001이와같은 형식입니다.

 

제발 조언 부탁드려요~~

 

이 글에 대한 댓글이 총 7건 있습니다.

 

저도 초보라서 뭐라 해결 방법은 잘 모르겠네요..

다만, 이건 프로그램 사양의 문제가 아닐까 생각합니다.

 

프로그램 사양을 님이 결정하는 것이라면 왜 이렇게 해야 되는 가에

대한 어느 정도의 배경을 말씀해 주셔야 좋은 의견을 모을수 있는것

같네요.

 

그게 아니라면 님의 현재 처한 난관에 대해서 사양을 결정하는 분에게

상담을 요청하는 것이 좋을 듯 합니다.

사양을 결정하는 사람이 이래야 한다면 이것에는 어떤 이유가 있고

그 이유에서 해결방법이 나오거나 아니면 해당 기능을 구현하기 위한

의견조율을 해야 할 것이라고 봅니다.

 

조건만을 딱 정해서 던지고 이거 어떻게 해결 하나요 라고 하는 것은

조언을 구하는게 아니라 문제를 풀어달라고 하는 것이랑 같지 않나

하는 생각에 어줍잖게 말씀 드립니다.

 

채민석(mice73)님이 2006-06-15 17:34에 작성한 댓글입니다.

말씀 감사합니다.

저도 여러가지 경우의 수를 고민한 끝에 여기에 여쭤본거구요.

고민도 안하고 무조건 조건만 던져서 문제 해결을 바란건 아닙니다.

 

제가 하고 있는 프로젝트의 매니저 분이 일본분이고 그쪽 사양서 대로 개발을 하다보니까 이전에는 하지 않았던 부분이어서요.

 

물론 시퀀스 테이블을 사용하여 문제를 해결하면 비어있는 id가 생기는것 이외에는 문제가 없을듯하여 클라이언트도 이부분에 대해서는 오케이 한 상황입니다만 아무래도 매끄러운 프로세스가 아닐듯 해서요.

 

이런 경우에 어떻게 처리하는지 여기저기 찾아보아도 없는듯 해서 이렇게 올립니다.

초보(hullari27)님이 2006-06-15 18:05에 작성한 댓글입니다.

요구사항 자체에 모순이 있는것 같습니다.

A라는 유저가 페이지에 진입할 때 기존의 값인 3+1 인 4를 보여주게 되고 입력하게 되면 4가 입력이 되어야 합니다. A유저가 저장을 하기 전에 B라는 유저가 들어오면 역시 3+1인 4를 보여주게 되고 이 유저 역시 자신이 저장할 값이 4라고 알고 있게 됩니다. 하지만 저장해보면 4가 아닌 5가 저장됩니다. 이것은 B라는 사용자가 자신이 예상한 것과 다른 동작이 일어난 셈입니다.

 

두 유저가 하나의 시퀀스에 대해 경쟁을 하게 된다는 소리인데 경쟁을 풀어내는 방법은 2가지가 있습니다. 두가지의 차이점은 경쟁이 일어나는 기간의 차이입니다. 첫번째는 A라는 유저의 진입부터 저장까지 B유저의 접근 자체를 막는 것이고 두번째는 A와 B에게 진입시 +1 된 고유값을 부여하는 것 입니다.

 

pgsql의 시퀀스는 두번째 상황에 알맞게 되어 있습니다. 시퀀스의 이가 빠지는 것에 대한 FAQ에도 시퀀스는 경쟁 시 락을 걸지 않기 위함이라고 되어 있습니다. 지나치게 늘어나는 수치에 대해 걱정하실지도 모르지만 int4 형식의 수치 범위도 엄청나게 큽니다. 정 불안하시면 저장을 int8로 하시면 됩니다. 시퀀스는 int8 범위의 수치를 지원합니다

신기배(소타)님이 2006-06-15 18:20에 작성한 댓글입니다.

신기배님 답변 감사드립니다.

요구자체에 모순이 있다는점을 저도 인정합니다.

처음 사양서를 볼때 지적을 했어야 하는데 (지적했다해서 사양서가 바뀔가능성은 없습니다만.^^;)

 

님의 말씀대로 비어있는 아이디는 디비상에 쌓이는것도 아니고 관리상의 문제일뿐이라고 생각합니다.

 

어차피 데이터를 삭제할때는 비어있는 아이디가 생기긴 합니다만.

 

현상태로 그냥 갈수 밖에 없다는 결론이 나오네요.

 

다시한번 답변 감사드립니다.

초보(hullari27)님이 2006-06-16 09:51에 작성한 댓글입니다.

혹시 보고서 번호같은 것을 작성할 때 사용하는 건가요?

 

사양서를 고치지 못한다는 것이 좀 의아하지만,

번호가 비는 것을 반드시 막아야 한다면, 저는 음수를 사용합니다.

그런 다음에 일련번호를 사용자가 고칠 수 있도록 하죠.

즉,

SELECT COALESCE(MIN(seqno), 0) -1

으로 가져와서 쓰고서는 다시 저장할 때,

SELECT COALESCE(MAX(seqno),0) + 1

로 저장합니다.

 

다시 저장할 때는 중복값 검사만 해주면 되고, 프로그램으로 처리하

는 것보다 사람 눈으로 빠진 번호를 알아채는 것은 쉬우므로,

번호가 이가 빠지는 것을 사용자들이 쉽게 막을 수 있습니다.

 

번호가 누락되면 곤란한 일련번호용 table에서 흔히 쓰는 방법이죠.

 

박인서(bubux)님이 2006-06-18 01:13에 작성한 댓글입니다.
이 댓글은 2006-06-18 01:16에 마지막으로 수정되었습니다.

 

박인서 님에게...

 

조그만 더 자세히 설명해 주시겠습니까??

참으로 재미있는 대안인것 같은데, 제가 이해력이 너무 부족해서

설명을 조금 더 자세히 해 주신다면 감사하겠습니다.

 

특히, 예를 들어주시면 SQL 의 실행후 어떻게 값을 가져오는 과정이

머리속으로 상상이 안 되서 그렇습니다..

어떤 값을 가져와서 어떻게 화면에 보이고 이것이 저장할때는

어떤 값으로 되서 어떻게 저장되는지 설명해 주시면 감사하겠습니다만.... ^^;;

 

혹시 메일을 주신다면 mice73jp@yahoo.co.jp로 보내주시면

감사하겠습니다. ^^;;

채민석(mice73)님이 2006-06-19 12:10에 작성한 댓글입니다.
이 댓글은 2006-06-19 12:12에 마지막으로 수정되었습니다.

 

현재의 목적을 다 채우려면 논리적인 모순이 분명한데....

비슷한 예로 은행에서 번호표를 받는경우와 비교해보면 좋겟네요

은행에서 번호표는 실제 처리하지 않은 빈번호가 많이 발생하죠

과연 은행이 하루 처리량을 따질때 이번호표의 마지막값을 가지고 처리할까요?


[ 등록할때 보여주는 아이디는 XXX_00001이와같은 형식입니다 ]

이 부분에서

 - ID를 발부하는시점이 잘못되었다
 - ID의 연번호가 반드시 유효값여야 한다는 가정이 문제가 있어보임니다
    ( 설사 처음 처리시 제데로 됐다더라도 나중에 삭제되는경우처리는?)
 
기술적인 처리문제 보다는 요구분석을 다시 해보심이 좋겟슴니다

위 문제는 DB종류나 성능문제가 아니고 단순히 논리적인 문제네요


 

가우님이 2006-06-21 09:01에 작성한 댓글입니다.
이 댓글은 2006-06-21 09:02에 마지막으로 수정되었습니다. Edit
[Top]
No.
제목
작성자
작성일
조회
6749Relation ... does not exist [4]
dba
2006-06-22
4146
6748카타오카씨에게 허락을 받았습니다. [4]
채민석
2006-06-20
3114
6747PL/pgSQL에서 GET DIAGNOSTICS 의 사용방법 좀 알려주세요.. [1]
채민석
2006-06-19
3087
6745중복아이디 생성 [7]
초보
2006-06-15
3826
6741날짜 계산 [2]
배움이
2006-06-14
4594
6740[문의]운영진 분들에게 [2]
채민석
2006-06-14
2899
6737PostgreSQL 에서 Oracle 로의 이전문제 [1]
이수정
2006-06-12
3252
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다