我目前正在开发一个中型网络项目,但我遇到了一个问题。
我想要做的是显示问题和图像。我有一个(全球)问题列表和一个(全局)图像列表,所有图像都应该被问到。
用户可以看到问题和图像应该随机选择。但是,答案(问题/图像对)的统计数据将用于研究目的。这意味着必须选择所有问题/图像对,以便答案将在所有问题和所有图像中均匀分布。
用户应该只能回答一次特定的问题/图像对。
我正在使用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可能是迄今为止我提出的最好的解决方案 非常感谢您的意见,谢谢您的时间。
答案 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