【问题标题】:More Efficient Way to Prevent Duplicate Voting防止重复投票的更有效方法
【发布时间】:2012-10-15 04:53:34
【问题描述】:

已经有一些与此类似的问题,但我希望得到一些不同的答案。

我在 Python 中的 Google App Engine 上有一个网站,我让注册用户对帖子进行投票,无论是向上还是向下,我只希望每个用户能够投票一次。

我想到并阅读的主要方法是简单地在每个帖子中保留一个已投票用户的列表,并且只向尚未投票的用户显示投票按钮。对我来说,这似乎是一个不雅的解决方案。当数百人对数百个帖子进行投票时,要跟踪这一点需要大量信息来跟踪这样一点点的功能。

虽然我可能错了。这和我想象的一样多的数据/数据存储写入猪吗?如果我每天有几百张选票,那不是什么大不了的事吗?

【问题讨论】:

  • 如果您愿意,您可以拥有针对每个用户的列表(因此它会跟踪用户投票的帖子的 ID)。使用起来更方便一些,但它本质上仍然是相同的解决方案。

标签: python google-app-engine google-cloud-datastore security voting


【解决方案1】:

创建一个看起来像这样的投票类型:

class Vote(db.Model):
    value = db.IntegerProperty() # Or whatever the vote value is.

诀窍是生成投票的密钥作为用户和帖子 ID 的组合。

keyname = str(user.id) + "-" + str(post.id)
vote = Vote.get_or_insert(keyname, value="vote value")

通过这种方式,您可以快速检查用户是否已经对给定的帖子进行了投票。

【讨论】:

  • 我想 get_or_insert 函数是我应该写的吗?这应该很容易我只是想确保这样的东西不存在,虽然我在文档中找不到它
  • 好的,很好。我不必这样做: Model.get_by_key_name() 先看看它是否存在?看起来 Model.get_or_insert() 实际上并不能告诉你它是否存在,它只是简单地返回实体
  • 我的错,你是对的。 get_or_insert() 不适合您。是的,您需要执行 get_by_key_name(),但我的答案的重要部分是使用一个简单的实体,其中键名与您要查找的内容相匹配,因此您无需发出花哨的查询。
  • 太好了,我可以从那里解决我只是需要一些灵感。感谢您的帮助!
【解决方案2】:

您是否尝试过避免重复的 set() 变量类型?

【讨论】:

    【解决方案3】:

    如果您对数百个帖子只有数百票,这不是大数据猪或读/写猪。我假设您将用户列表作为列表存储在数据存储的 post 实体中。根据您是存储指向用户的 long 还是存储他们电子邮件的字符串,您可能最多为每个用户每个帖子使用 10 个字节。如果每个帖子有 1000 张选票和 1000 个帖子,那么您将使用 10 MB。另外,它不会增加读/写的成本。如果您愿意,您可以通过不对值编制索引来降低成本,而只需在从数据存储中获取所需信息时对其进行搜索。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-16
      • 2013-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多