2012-07-19 4 views
1

저는 파이썬으로 Google 애플리케이션 엔진에 웹 앱을 작성하고 있습니다. jinja2를 템플릿 엔진으로 사용하고 있습니다.단일 사용자가 여러 번 투표하는 것을 방지하는 방법

현재 사용자가 게시물을 upvote 및 downvote 할 수 있도록 설정했지만 현재는 원하는만큼 여러 번 투표 할 수 있습니다. 나는 단순히 데이터베이스에 투표 기록을 가지고 그 직후에 그것을 계산합니다. 사용자가 여러 장의 투표를 효율적으로 수행하지 못하게하려면 어떻게해야합니까?

+0

지금까지 해본 내용을 보여줄 수 있습니까? – Conner

+0

글쎄, 첫 번째 단계는 이미 투표했을 경우 버튼을 비활성화하는 것입니다. 다음 단계는 어쨌든 서버 측 로직을 조심스럽게 추가하는 것입니다. – voithos

+0

@Conner 실제로 내 컴퓨터에 있지는 않지만 오늘 오후에 현재 코드를 올릴 수 있습니다. – clifgray

답변

1

투표 사용자를 투표에 저장하고 데이터베이스를 사용하여 현재 사용자가 기존 투표를 확인하십시오. .

페이지를 제공하기 전에 (또는 투표 단추를 사용하지 않도록 설정) 또는 투표를 시도 할 때 (그리고 어떤 종류의 메시지 표시) 점검을 수행 할 수 있습니다. 투표가 정말로 중요한 경우 두 시나리오를 처리하는 코드를 작성해야합니다.

+0

처음에는 간단한 if 문이 작동 할 것이라고 생각했지만 10,000 표가 있으면 어떻게됩니까? (분명히 아직 없다) 사용자의 모든 투표를 확인하는 것이 다소 비효율적이지 않습니까? 또는 생각만큼 CPU가 비싸지 않은 것 같습니다. – clifgray

+0

@clifgray이 작업을 효율적으로 수행하려면 데이터베이스의 쿼리 기능을 사용해야합니다. – Marcin

+0

아, 알았어. 덕분에 구현할 수있을만큼 간단해야합니다. – clifgray

2

나는 투표를 토글하고자하는 항목의 키와 투표를하는 사용자의 키를 받아들이는 toggleVote 방법을 제안합니다.

나는 또한 기본적으로 두 개의 필드 포함, 투표를 기록하는 테이블을 추가하는 게 좋을 것 : 항목이 존재하는 경우

"keyOfUserVoting", "keyOfItemBeingVotedOn" 

당신은 키가 일치 매우 질의을 간단하게 할 수 있습니다 그 방법을하고, 다음 당신은 그 항목에 투표 한 사용자를 압니다. (Query where keyOfUserVoting = 'param1' and keyOfItemVoted='param2', if result != None는, 다음은 사용자가 투표를 의미)가 toggleVote() 메소드에 대한

경우는 매우 간단 수 :

toggleVote(keyOfUserVoting, keyOfItemToVoteOn): 
    if (queryResultExists): 
     // delete this record from the 'votes' table 
    else: 
     // add record to the 'votes' table 

당신이에 추적하는 데 대해 걱정할 필요가 없습니다 그 방법 사용자가 투표 한 횟수에 대한 개별 기준.

또한이 방법을 사용하면 항목에 몇 개의 득표가 있는지 알아 보려면 에 신속하게 다른 쿼리를 수행 할 수 있습니다. 다시 GAE를 사용하면 매우 빠릅니다. 이 설정에서

, 당신은 신속하게 ... 사용자가 하나 개의 항목 ( count where userKey = value and where itemKey = value), 또는 얼마나 많은 시간을 사용자가 전체 시스템 ( count where userKey = value)에 투표 한 투표 횟수를 알 수

마지막으로 최고의 신뢰도를 얻으려면 특히 사용자 또는 투표 된 항목에 대해 다른 작업을 수행 할 경우 트랜잭션에서 toggleVote() 메소드로 업데이트를 래핑 할 수 있습니다.

희망이 도움이됩니다.

+0

"빨리"와 "수"는 서로 상반됩니다. –

+0

GAE 데이터 저장소 쿼리는 선형 시간에 발생하고 'count()'함수는 "모든 결과를 실제로 검색하는 것보다 일정한 요소만큼 빠릅니다". 그러나 투표 수를 빠르게 얻기 위해 OP는 항목에 'voteCount'를 증가/감소시킬 수 있습니다.이 항목은 빠른 voteCount가 필요할 때마다 검색됩니다. 증분/감소 작업은 대답에 언급 된 거래에 속합니다. – Cuga

관련 문제