我正在构建简单的Web应用程序,用户可以在其中投票。检查用户是否已经投票的最快方法是什么?我对关系数据库和基于文档的数据库都感兴趣(mongodb,.)
我没有什么想法,但我相信它们是可以改进的:
关系数据库
为投票创建一个单独的表:
|userid|articleid|在增加文章之前,请投票,检查是否有一个行,包括userid和articleid。我们有两个问题。是否有可能通过触发器来改进这一点?例如:
|useridarticleid| unique column投票前,在应用程序端生成useridarticleid。尝试插入useridarticleid。触发器将触发,如果字段是新的,它将增加我们在文章中的投票栏。
基于文档的
这就更棘手了。因此,具有如下结构的文档:
{
"id": "123",
"content": "something",
"num_votes": 2,
"votes" : [
"userid1",
"userid2"
]
}第一个“查询”-检查用户标识是否在选票数组中。第二个“查询”--如果没有,则增加num_votes。
再问两个问题。所以我想我们可以改变这一点,但我不知道它是否会提高性能:
在选票数组中插入用户in。当用户想要检查文章“计数”在数组中的选票。但我认为,性能可能会下降,因为如果流量很高,计算每一篇文章都是有点浪费。想象一下Reddit在这里。
发布于 2012-07-15 19:49:30
实际上,在文档数据库中它要简单得多。您的文档结构非常适合它。
{
"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,将用户in添加到选民列表中,并在此文档的选票列表中未包含用户in的情况下,只增加一个(只增加)。
所以只有一个查询和一个更新--它们实际上是相同的操作。
发布于 2012-07-15 15:38:10
在关系数据库中,使用这两个字段作为主键是最好的方法。
在第二个文件中,您还可以考虑在用户文档或文章文档中进行投票。
无论如何,我建议您真正专注于创建一个设计,在这里,稍后更改所有这些决定是很容易的。
不同的设计方法,喜欢“同一篇文章中的许多用户”或“许多不同文章中的用户”等。在你看到真正的用法之前,你将没有足够的信息来决定哪种方法最有效和最快.因此,创造一些东西,你可以很容易地适应任何你以后学到的信息。
顺便说一句:你也可以考虑不要同时计算选票。我记得一篇文章(我找不到),其中提到你的投票号码实际上“不准确”.他们对当前的选票进行了估计,并在后台工作线程中计算了真实的票数。
https://stackoverflow.com/questions/11493157
复制相似问题