【发布时间】:2012-04-30 23:38:25
【问题描述】:
有人要求我向应用程序添加功能,让用户在 A 和 B 两个选项之间进行投票。这些问题的表格非常基本:
QUESTIONS
question_id (PK)
option_id_1(FK)
option_id_2(FK)
urgent (boolean)
每次用户投票时,该用户已投票的信息都会存储在一个同样简单的表中:
USER VOTES
vote_id (PK)
user_id (FK)
question_id (FK)
当用户请求新问题时选择出现哪个问题的算法很复杂,但出于我们的目的,我们可以假设它是随机的。那么,有什么问题吗?
每个用户都会对许多问题进行投票。可能数百,甚至数千。我需要确保没有用户收到他们已经投票过的问题,而我想这样做的唯一方法是,我猜,将服务器打到遗忘状态。具体来说,类似:
SELECT * from questions WHERE question_id NOT in (SELECT question_id from user_votes WHERE user_id = <user_id>) ORDER BY RAND() LIMIT 1.
[注意:RAND() 实际上不在查询中 - 它只是作为稍微复杂的 (order_by) 的替代品。]
因此,请记住,许多用户很可能已经对数百个甚至数千个问题进行了投票,并且不可能按固定顺序呈现问题...关于如何排除已投票问题的任何想法把我的服务器打到地上?
感谢所有建议 - 非常感谢。
【问题讨论】:
-
RAND() 可能是一个很大的性能缺陷,仅供参考
-
干杯西蒙。 rand() 只是为了演示目的,它是一个 order_by [bunch of fields]。以上编辑。
-
可能有助于查看实际订单,只是为了将来参考 :) 看到 RAND() 不同于查看特定标准 :)
标签: mysql performance database-design optimization