2014-02-23 9 views
0

로그인 시스템을 만들고 싶습니다. 전자 메일로 활성화 코드 (클릭 가능한 링크)를 보내 확인을 원합니다. 사용자 정보와 별도의 테이블에 활성화 키를 저장하는 것은 활성화되지 않은 사용자에게만 관련이 있기 때문에 고려했습니다. 사용자가 사용자 정보를 포함하는 행을 등록하면 활성화 테이블의 사용자 테이블과 활성화 키에 삽입됩니다. 링크를 클릭하면 활성화 테이블에서 레코드가 제거됩니다. 그러나 나는 나의 호스팅에서 innodb를 사용할 방법이 없기 때문에, 트랜잭션을 사용할 수 없기 때문에 이것은 결함이 아닙니다. 2 가지 옵션이 있습니다. 옵션 A : 키를 활성화 표에 보관합니다. 활성화가 필요한지 확인하기 위해 사용자 테이블에 부울을 저장합니다. 활성화가 필요하고 활성화 테이블에서 찾을 수있는 레코드가 없으면 레코드를 추가하고 사용자에게 전자 메일을 다시 보내려는 시도가있을 수 있습니다. 가진, 아니면 사용자 테이블에서 활성화 키를 저장할 수 있습니다 : (어떤 기록도 발견되지 않은 경우 PHP) * 더 검사 이 * * 더 삽입을 확인하기 위해 선택에 조인// 업데이트myisam을 사용하여 별도의 테이블에 활성화 키 저장

옵션 B를 삭제 더 많은 공간을 사용하려면 항상 사용되는 것은 아닙니다. * 사용하지 않는 저장소는 항상 myisam을 사용하여 공간을 차지합니까? * 정품 인증 키의 권장 길이는 얼마입니까? * 부울이 여전히 필요합니까? 아니면 사용자가 활성화되었는지 여부를 확인하기 위해 활성화 키를 NULL로 설정할 수 있습니까?

최상의 솔루션은 무엇이며 그 이유는 무엇입니까? 속도, 공간, ....?

답변

0

질문의 핵심은 활성화 순간과 관련이있는 것으로 보입니다. InnoDB 대신 MyISAM을 사용해야하므로 정품 인증과 관련하여 트랜잭션 경쟁 조건이 발생할 수 있으므로 걱정할 필요가 없습니다.

이것은 중요한 문제는 아닌 것 같습니다. 새 사용자가 동일한 올바른 토큰으로 여러 번 활성화하려고하거나 올바른 토큰과 동시에 잘못된 토큰으로 활성화하려고하면 아무런 해를 끼치 지 않습니다.

중요한 성공 요인은 무엇입니까? 활성 사용자에 대한 일반 인증 작업 (로그인)의 성능. 쿼리가 로그인하는 모든 사용자에 대해 별도의 활성화 토큰 테이블에 가입해야하는 경우 이상적인 성능을 제공하지 않습니다. 당신은 당신의 사용자 테이블에서 "활성화 보류"를 표시하는 부울 열 값 (짧은 정수)를 사용할 수 있습니다

AND user.activation_token IS NOT NULL 

: 어느 쪽도이 같은 절을 포함하는 쿼리는 없다. 일반 로그인 중에 해당 열이 나타나면 자주 사용되지 않는 추가 논리를 호출하여 활성화 할 수 있습니다. 예를 들어,이 작업을 가속화 할 수 있도록해야하는 경우

SELECT hashed_password, activation_pending 
    FROM user 
    WHERE username = ? 

당신은 (username, hashed_password, activation_pending)에 복합 인덱스를 작성하고 그 작업이 매우 효율적으로 만들 수 있습니다. 그런 다음 보류중인 활성화 (비교적 드문 작업)를 성공적으로 완료하면이 두 작업을 수행 할 수 있습니다. activation_pending 일단

UPDATE user 
    SET activation_pending = 0 
    WHERE user = ?; 

    DELETE 
    FROM activation_token 
    WHERE user = ?; 

가 0으로 설정, 즉 경쟁 조건에 대한 충분 : 로직이 activation_token 테이블에 보이지 않는 것입니다.

varchar 길이가 0 인 문자열이 포함 된 열은 많은 공간을 차지하지 않습니다. char 칸입니다.

+0

감사합니다. 이것은 완벽한 의미가됩니다! – cowgirl