我正在构建一个小型在线应用程序(PHP / MySQL),用户可以注册成为会员,在会员区内,他们可以获得一系列测验。
当显示给定用户的测验列表时(即他的浏览器刚刚请求带有列表的页面),我需要知道,对于每个测验,用户是否已经过去了。因为如果他这样做我会在旁边显示一个复选标记。这是为了帮助用户跟踪他们对网站的使用情况。
我的问题:所以基本上我需要存储一个"采取的测验列表"为每个用户。但我不确定这样做的最佳方式。
到目前为止我的解决方案:每个测验都有一个ID,所以我打算存储"采取的测验列表"对于每个用户,我的数据库为字符串(值以逗号分隔)。然后,当我需要使用它时,我从数据库中读取字符串并将其转换为数组(反之亦然,以便将其存储回来)。
UPDATE :显然有两个可行的选项:1)使用上面描述的方法将数组存储为字符串,2)是创建另一个MySQL表来存储测验ID / user-id对。在这一点上,我想知道哪个解决方案更快,如果网站变得流行。使用第一个选项,我将有额外的工作将字符串转换为数组并返回,但之后我将搜索一个小数组(即,仅包含单个用户的测验)。使用MySQL解决方案,我不需要来回转换字符串,但我需要搜索更大的数据集(即所有用户进行的所有测验)。对于大量用户(例如,1000)哪种方法更快的猜测?
答案 0 :(得分:2)
如果您使用像MySQL这样的东西,那么尝试一个类似的表结构:
表:用户
user_id | user_name
表:测验
quiz_id | quiz_name
表:quiz_taken
taken_id | user_id (FK) | quiz_id (FK) | timestamp
在quiz_taken表中为每次参与测验添加一个条目。此外,您可以随时添加更多颜色以存储更多详细信息。
答案 1 :(得分:1)
这个解决方案对我来说似乎没问题。或者您可以在中间使用“测验”表和users_to_quizs表,其中外键链接到用户和测验。它更符合关系数据库标准,但对于你想做的事情来说似乎有点复杂!
我会坚持你的解决方案! (你使用PHP吗?>在这种情况下使用implode / explode,你会得到你真正快速的东西!: - ))
答案 2 :(得分:0)
check123的解决方案很好。 您不希望将整个测验存储为数组 一个补充
taken_id | user_id(FK) | quiz_id (FK) | timestamp | responses
虽然响应的单独表格更好,但如果您不需要搜索回复, 要转换测验数组,请使用
$quiz_string=json_encode($quiz_array)
//Store $quiz in the responses field
//and to convert it back to array, use:
$quiz_array=json_decode($quiz_string_from_database)
构建和减少爆炸是非常耗时的。 json工作得很好