使用均匀分布伪随机选择数据

时间:2011-03-04 18:35:31

标签: php mysql sql performance

我目前正在开发一个中型网络项目,但我遇到了一个问题。

我想要做的是显示问题和图像。我有一个(全球)问题列表和一个(全局)图像列表,所有图像都应该被问到。

用户可以看到问题和图像应该随机选择。但是,答案(问题/图像对)的统计数据将用于研究目的。这意味着必须选择所有问题/图像对,以便答案将在所有问题和所有图像中均匀分布。

用户应该只能回答一次特定的问题/图像对。

我正在使用mysql数据库和php。目前,我有三个数据库表:

tbl_images (image_id)

tbl_questions (question_id)

tbl_answers (answer_id, image_id, question_id, user_id)

其他列与此特定问题无关。

解决方案1: 跟踪每个图像/问题的使用次数(在每个表中添加一列)。始终选择至少被问到的图像和问题 的问题: 我真正感兴趣的是分配图像的问题,反之亦然,而不是每个问题都是全球性的。

解决方案2: 添加另一个表,其中包含所有问题/图像对以及询问的次数。选择最低组合(如果计数列按升序排序,则为第一行) 的问题:   不强制用户只能回答一次问题。也不给用户选择随机的外观。

解决方案3:   与#2相同,但在表格中存储问题/图片/ user_id 问题:   性能问题(?),每个用户浪费了大量空间。可能会有大量的数据(数千个问题/图像和至少数百个用户)。

解决方案4:   从所有可用的随机选择一个问题和图像。有足够多的答案,他们将均匀分配 的问题:   如果我添加一个新的问题或图像,他们将得不到比其他人更多的答案,因此永远不会赶上。我想要所有问题/图像对的均匀统计数据。

解决方案5:   加权随机。选择一些真实随机的问题/图像对(比如说大约10-100)并选择用户未应答的最佳(如最低全局计数)。
问题:   不保证最近添加的问题或图像能够快速获得大量答案。

解决方案#5可能是迄今为止我提出的最好的解决方案 非常感谢您的意见,谢谢您的时间。

1 个答案:

答案 0 :(得分:0)

根据我对你的问题的理解,我会选择#1。但是,您不需要新列。我会创建一个SQL视图而不是因为你需要报告这样的事情。视图基本上是一个缓存的选择,但行为类似于表。因此,您将创建一个视图,以保持每个图像的每个问题的总和:

DROP VIEW IF EXISTS "main"."view_image_question_count";
CREATE VIEW "view_image_question_count" AS 
SELECT a.image_id, a.question_id, SUM(b.question_id) as "total"
FROM answer AS a
INNER JOIN answer AS b ON a.question_id = b.question_id
GROUP BY a.image_id, a.question_id;

然后,您需要一种快速简便的方法来获得下一个最佳图像/问题组合:

DROP VIEW IF EXISTS "main"."view_next_best_question";
CREATE VIEW "view_next_best_question" AS 
SELECT a.*, user_id
    FROM view_image_question_count a
    JOIN answer USING( image_id, question_id )
    JOIN question USING(question_id)
    JOIN image USING(image_id)
ORDER BY total ASC;

现在,如果您需要报告图像以询问性能,可以通过以下方式进行报告:

SELECT * FROM view_image_question_count

如果您需要下一个最佳图片+问题来询问用户,请致电:

SELECT * FROM view_next_best_question WHERE user_id != {USERID} LIMIT 1

!= {USERID}部分是为了防止出现用户已经回答的问题。 LIMIT优化为只获得一个。

免责声明:可能需要做很多工作来优化这一点。我只想发表一些想法。

此外,这是我用于测试的数据库转储。 http://pastebin.com/yutyV2GU