【问题标题】:Unique vote, disable revote唯一投票,禁用投票
【发布时间】:2012-07-14 15:25:09
【问题描述】:

我正在构建用户可以投票的简单 Web 应用程序。 检查用户是否已经投票的最快方法是什么。我对关系数据库和基于文档的数据库(mongodb,...)都感兴趣

我有一些想法,但我相信它们可以改进:

关系数据库

创建单独的投票表:

|userid|articleid|

在增加文章投票之前,检查是否有一行同时包含用户 ID 和文章 ID。我们有两个查询。可以通过触发器来改善这一点吗?例如:

|useridarticleid| unique column

投票前在应用端生成 useridarticleid。尝试插入 useridarticleid。如果字段是新的,触发器将触发,它将增加我们在文章中的投票列。

基于文档

这有点棘手。因此,文档结构如下:

{
  "id": "123",
  "content": "something",
  "num_votes": 2,
  "votes" : [
               "userid1",
               "userid2"
             ]
}

第一个“查询” - 检查用户 ID 是否在投票数组中。第二个“查询” - 如果不是,则增加 num_votes。

再次进行两个查询。所以我认为我们可以改变这一点,但我真的不知道它是否会提高性能:

在投票数组中插入用户 ID。当用户想要检查文章“计数”数组中的投票时。但我认为性能可能会下降,因为如果流量很高,计算每篇文章有点浪费。想象一下这里的 Reddit。

【问题讨论】:

    标签: mongodb database-design relational-database


    【解决方案1】:

    实际上,在文档数据库中它要简单得多。您的文档结构非常适合它。

    {
      "id": "123",
      "content": "something",
      "num_votes": 2,
      "votes" : [
                   "userid1",
                   "userid2"
                 ]
    }
    
    db.collection.update(
            {id:"123", votes:{$ne:"userid"}},
            {$push:{"votes":"userid"},$inc:{"num_votes":1}}
    );
    

    这将自动更新记录 id=123,将用户 ID 添加到投票者列表中,如果用户 ID 不在此文档的投票列表中,将投票增加一.

    所以只有一个查询和一个更新——它们实际上是相同的操作。

    【讨论】:

    • 我认为您也不需要关系数据库案例的触发器 - 只需在 userid、articleid 表上添加唯一约束,任何重复插入都会失败。
    【解决方案2】:

    在关系数据库中 |userid|articleid|将两个字段都用作主键是最好的方法。

    在第二个中,您还可以考虑将投票放在用户文档中,还是放在文章文档中。

    无论如何,我建议您真正专注于创建设计,以后更改所有这些决定很容易。

    不同的设计方式,喜欢“很多用户同时在同一篇文章中”或“很多用户在不同的文章中”之类的东西......直到你看到真正的用法,您将没有足够的信息来决定哪种方法最有效和最快……因此,请创建一些您可以轻松适应以后学到的任何信息的东西。

    顺便说一句:您也可以考虑不同步计算选票。我记得一篇文章(我找不到),其中提到你的投票数字实际上并不“准确”......他们对当前投票进行了估计,并在后台工作线程中计算了实际数字。

    【讨论】:

    • 在文档模型中,当您将投票者插入数组时,增加投票可确保两者不会不同步。如果投票计数与选民分开存储,那么要获得绝对准确的计数,您需要一份定期检查计数的工作。
    猜你喜欢
    • 2012-03-15
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多