2012-09-08 2 views
2

내 사이트, 사용자 및 게스트에 두 가지 유형의 사람들이 있습니다. 실제로 생성/인증 프로세스를 제외하고는 동일합니다. 순간 데이터베이스 디자인 : 사용자 및 게스트

나는 두 개의 테이블이 있습니다

t_users 

userId[PRIMARY, AUTOINC] username[UNIQUE] 

t_guests 

guestId[PRIMARY, AUTOINC] userId 

누군가가 사이트를 입력하면 스크립트는 다음을

1) t_guests에 새 행을 삽입하여 새로운 고객 레코드를 작성

2) 이전 단계에서 생성 된 guestId를 사용하여 새 레코드를 t_users에 추가합니다 (guest username = "Guest guestId")

3) 게스트 레코드 설정 u 두 번째 단계에서 할당 된 서버 번호

많은 데이터베이스 취약점을 포함하고 있기 때문에이 데이터베이스 디자인이 끔찍하다고 생각합니다. 예를 들어 사용자 이름 "Guest xyz"가 t_users 테이블에 이미있는 경우 2 단계는 실패하고 3 단계는 userId에 잘못된 값을 할당합니다 (구현에 따라 0 또는 guestId가 1 단계에서 할당 됨).

실제로 저는 손님을 위해 고유 한 사용자 이름을 생성하기 위해 자동 증가 기능을위한 t_guests 테이블 만 필요합니다. 단일 쿼리를 사용하여 하나의 통합 테이블을 사용하고 게스트를 등록하는 방법이 있습니까?

업데이트 : 나는 하나의 테이블에 손님을 삽입하기 위해 다음을 수행 할 수 있습니다 :

SELECT @mg := IFNULL(MAX(guestId), 0) + 1 FROM t_users; 

INSERT INTO t_users (guestId) VALUES(@mg); 

하지만 아무도 그 두 실행 사이에 t_users에 새로운 게스트 기록을 삽입 없다는 것을 확신 할 수 없다 진술. 그리고 나는 실제 사용자가 0이되도록 guestId를 유일하게 만들 수 없습니다.

+1

'사용자'테이블에'type' 열을 추가하고 사용자 유형 ('user','guest','admin' 등)을 지정하지 않는 이유는 무엇입니까? – Blender

+0

"type"열은 옵션이지만 명명 문제를 해결하지 못합니다. 게스트 이름을 Guest 1, Guest 2, Guest 3 등으로 지정합니다. –

답변

1

당신은 당신이 GUID를 생성하는 스크립트를 사용하여 사용할 수있는 사용자 이름 " 사용자 ID, 사용자 이름, 유형

1 개 테이블이있는 경우 당신이 사용하는 경우 사용자 이름, 또는 someother 확률 변수로. GUID 충돌하는 2 개의 guids를 얻는 것은 사실상 불가능합니다.

또한 사용자 이름 열이 고유해야하는 경우 충돌하는 2 개의 사용자 이름이있는 경우 삽입이 실패하고 다시 시도 할 수 있습니다.

여기에 1 개의 테이블이 있어야합니다.

관련 문제