8

我在一个投票网站上工作,我想知道我应该如何处理投票。

例如,当您为问题(或答案)投票时,您的投票将被存储,并且每次我返回页面时,我都可以看到我已经为这个问题投票,因为向上/向下按钮是彩色的。

你是怎样做的?我的意思是我有几个想法,但我想知道它是否不会对数据库造成沉重的负担。

这是我的想法:

  • 编写一个助手,如果已投票,它将检查每个问题

    这意味着查询的数量将取决于页面上显示的项目数量(通常约为 20)

  • 在我的项目上循环获取 id 并为每个页面编写一个查询,如果已投票或为 NULL,该查询将返回

    看起来不错,因为只有一个查询与页面上有多少项目无关,但可能会破坏某些 MVC/域模型设计,不知道。

  • 当用户登录(或为其创建匿名用户的来宾)检索所有投票时,将它们存储在会话中,如果进行了新投票,只需将其添加到会话中。

    看起来不错,因为除了第一个之外根本不需要查询,但是,这一个以及根据投票的数量(可能每个用户可能有一堆)可以增加每个用户的会话大小并可能进行身份验证减缓。

你好吗?还有其他想法吗?

4

3 回答 3

1

例如:假设您有一个表格来存储投票和投票的用户。

让我们假设您在user_votes使用如下表结构进行投票时保留投票。

id of type int autoincrement
user_id type int, Foreign key representing users table
question_id type of int, Foreign key representing questions table

现在,由于用户将登录,当您获取问题时,请使用user_votes表中的 user_id 进行左连接。

就像是

SELECT q.id, q.question, uv.id 
   FROM questions AS q 
   LEFT JOIN user_votes AS uv ON 
      uv.question_id = q.id AND 
      uv.user_id = <logged_in_user_id> 
   WHERE <Your criteria>

从视图中,您可以检查 id 是否存在。如果是这样标记投票,否则不是。

您可能需要更改问题表的字段和所有字段。我假设您将问题存储在questions表格中,将用户存储在表格中user。都有主键id

谢谢

于 2011-08-15T07:39:35.503 回答
0

您可以结合使用建议的策略。

仅检索登录用户对最近/活动问题所做的所有投票并将其存储在会话中。

然后,您拥有更可能需要的那些,同时仍然减少了您需要在会话中存储的数量。

如果您需要其他结果的可能性较小,请在需要时查询这些结果。

此策略将减少您需要在会话中存储的数量,并减少您对数据库进行的调用次数。

于 2011-08-15T18:01:37.453 回答
0

仅基于您目前提供的信息,我将采用第二种方法:获取页面上所有项目的 ID,然后执行单个查询以获取所有用户对该项目 ID 列表的投票。然后将用户项目投票的集合传递给您的视图,这样当用户为该项目投票时,它可以以不同的方式呈现项目。

如果我理解正确的话,其他两种方法似乎效率较低。使用视图助手为每个项目启动单独的查询以检查用户是否对其进行了投票,这可能会导致大量不必要的查询。并且在登录时预加载所有用户的投票历史似乎会增加不必要的开销,获取并不总是需要的数据,并增加在会话期间保持更新的负担。

于 2012-05-04T01:58:10.900 回答