1

我正在构建简单的 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。

4

2 回答 2

1

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

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

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

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

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

于 2012-07-15T15:38:10.050 回答
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,将 userid 添加到投票者列表中,并且当 userid 不在此文档的投票列表中时,才会将投票增加一。

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

于 2012-07-15T19:49:30.243 回答