独特投票,禁用revote

时间:2012-07-15 15:28:03

标签: mongodb database-design relational-database

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

我的想法很少,但我相信它们可以改进:

关系数据库

创建一个单独的投票表格:

|userid|articleid|

在递增文章之前,请检查是否存在包含userid和articleid的行。我们有两个问题。有可能通过触发器改善这一点吗?例如:

|useridarticleid| unique column

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

基于文档

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

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

首先“查询” - 检查userid是否在投票数组中。第二个“查询” - 如果没有增加num_votes。

再次提出两个问题。所以我认为我们可以改变它,但我不知道它是否会提高性能:

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

2 个答案:

答案 0 :(得分:1)

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

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

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

设计这个的不同方式,有利于“同时在同一篇文章中的很多用户”或“不同文章中的很多用户”等等......直到你能看到真实的用法,你将没有足够的信息来决定哪种方法最有效,最快......所以创建一些你可以轻松适应你以后学到的信息的东西。

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

答案 1 :(得分: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不在此文档的投票列表中

因此,只有一个查询和一个更新 - 它们实际上是相同的操作。