我在投票网站上工作,我想知道如何处理投票。
例如,当您投票支持问题(或答案)时,您的投票会被存储,每次我返回页面时,我都可以看到我已经投票支持这个问题,因为上/下按钮是彩色的。
你是怎么做到的?我的意思是我有几个想法,但我想知道它是否会对数据库造成沉重负担。
以下是我的想法:
写一个帮助者,如果投票已被投票,将检查每个问题
这意味着查询的数量取决于页面上显示的项目数量(通常为~20)
我的项目上的循环获取ID,并且每个页面都会写一个查询,如果投票已经投票或返回NULL将返回
看起来不错,因为只有一个查询与页面上的项目无关,但可能会破坏一些MVC /域模型设计,不知道。
当用户登录(或为其创建匿名用户的访客)检索所有投票时,将其存储在会话中,如果投入新投票,只需将其添加到会话中。
看起来不错,因为除了第一个之外根本不需要任何查询,但是,根据投票的数量(可能是每个用户一堆),这个可以增加每个查询的大小用户可能会使身份验证变慢。
答案 0 :(得分: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
。
由于
答案 1 :(得分:0)
您可以结合使用建议的策略。
仅检索登录用户对最近/活动问题所做的所有投票,并将其存储在会话中。
然后,您可能会更有可能需要的那些,同时仍然减少您在会话中存储的金额。
如果您不太可能需要其他结果,请在需要时查询这些结果。
此策略将减少您在会话中存储的数量,并减少您对数据库的调用次数。
答案 2 :(得分:0)
根据目前为止提供的信息,我将采用第二种方法:获取页面上所有项目的ID,然后执行单个查询以获取该列表的所有用户投票物品ID。然后将用户项目投票的集合传递给您的视图,这样当用户投票选择该项目时,它可以以不同方式呈现项目。
如果我理解正确的话,其他两种方法看起来似乎效率会降低。使用视图助手为每个项目启动单个查询以检查用户是否对其进行了投票可能会导致大量不必要的查询。并且在登录时预加载所有用户的投票历史似乎增加了不必要的开销,获得并非总是需要的数据,并增加了在会话期间保持最新的负担。