2012-03-15 1 views
1

전자 상거래를 처음부터 구축하고 있으며 사용자가 로그인하지 않고도 수행 할 수있는 많은 작업이 있습니다 (장바구니에 항목 추가, 자신의 맞춤형 제품 작성) . 이를 해결하기 위해 UUID를 포함하는 쿠키를 생성하고, MySQL 테이블 "Users"에 UUID를 저장하고 모든 정보를 해당 UUID에 연결합니다. 사용자가 결국 계정을 등록 할 때 원래 UUID와 연결된 "Registered_Users"테이블에 닉네임, 해시, 소금 및 전자 메일을 저장합니다 (NULL 필드가있는 단일 테이블을 사용할 수도 있지만 이는 중요하지 않습니다) 등록되지 않은 경우 사용자에 관한 정보를 검색하지 않으면 쓸모 없게됩니다.PHP와 UUID를 사용하여 동적 웹 페이지 상태를 추적 유지

사용자가 쿠키를 삭제하면 어떻게됩니까? UUID는이 작업에 적합한 선택입니까?

전체 전자 상거래가 SSL보다 뒤떨어져 있습니다.

답변

1

선택한 시스템이 나에게 잘 어울립니다. "사용자가 쿠키를 삭제하면 어떻게됩니까?"라는 질문에 대해서는 두 가지 결과가 있습니다.

먼저 사용자는 카트와 개별 제품을 잃어 버립니다. 그러나 이것은 어떻게 든 예상되는 행동이므로 걱정할 필요가 없습니다. 등록하지 않을 때 사용자가 중요한 데이터를 모두 잃어 버리지 않아야한다고 염려하는 경우 UUID를 저장하는 다른 방법 (예 : localStorage 또는 Flash 쿠키)을 고려하십시오. 모든 가능성 목록 (해당 사항 중 상당수는 응용 프로그램에 적합하지 않음)은

두 번째로 UUID 및 기타 데이터가있는 데이터베이스 테이블은 시간이 지남에 따라 커질 것입니다. 따라서 때때로 사용자가 계정에 등록하지 않은 이전 항목을 삭제해야합니다. 두 테이블은 등록하지 않은 사용자를 식별하기 위해 상대적으로 쉬운 방법입니다. 여기에 기존 항목의 정리가 SQL 함께 할 수있는 방법입니다 :

DELETE FROM Users WHERE date_created < '2012-01-01' AND 
    UUID NOT IN (SELECT UUID FROM Registered_Users); 

내가 DATEDIFF 기능을 피하기 위해 여기에 고정 된 날짜를 선택했다.
사용자를 삭제하기 전에 다른 데이터를 먼저 삭제해야 할 수 있습니다.

UUID가 데이터베이스와 성능 관점에서 좋은 선택 인 경우 자신의 의견을 형성하기 위해 this article을보십시오. 자동 증가 기본 키를 Users에서 사용하는 것만으로 충분합니다.

+0

등록되지 않은 사용자를 "정리"해야하는지 여부를 결정하는 좋은 기준은 무엇입니까? 고정 된 비활성 시간은 너무 얕습니다. –

+0

auto_increment를 사용하면 동시성 문제가 발생합니다. 단계는 다음과 같아야합니다. 1) 새 행을 작성하십시오. 2) ID를 검색하여이를 쿠키에 저장하십시오. 이 작업은 원자 적이어야하고 PHP/MySQL에서는 트랜잭션을 사용하지 않고 가능하지 않다고 생각합니다 (가능한 한 많이 피하고 싶습니다). –

+0

'얕은'이란 뜻이 확실하지 않습니다. 생성 날짜를 사용하지 않고 마지막 활동 시간을 사용하지 않고 큰 간격 (30 일 이상)을 선택하면 돌아 오지 않거나 쿠키를 삭제하지 않은 사용자 만 삭제할 수 있습니다. 두 개의 동시 요청이'Users'에 레코드를 생성하면, 항목은 자동 증가 ID를 가지며'PDO :: lastInsertId' 또는'mysqli-> insert_id'를 호출하면 쿠키에 저장할 수있는 두 개의 다른 ID가 반환됩니다. 하나의'INSERT' 문 (트랜잭션을 사용하지 않고)은 아주 원자 적입니다. – chiborg