我正在构建一个小型在线应用程序(PHP/MMySQL),用户可以在该应用程序中注册成为会员,在会员区内,他们可以进行一系列测验。
当显示给定用户的测验列表时(即,他的浏览器刚刚请求了带有列表的页面),我需要知道,对于每个测验,用户过去是否已经参加过。因为如果他这样做了,我会在旁边显示一个复选标记。这是为了帮助用户跟踪他们对网站的使用情况。
我的问题:所以基本上我需要为每个用户存储一个"已完成测验"的列表。但我不确定最好的方法
到目前为止我的解决方案:每个测验都有一个ID,所以我计划将每个用户的"已参加测验"列表作为字符串(值用逗号分隔)存储在我的数据库中。然后,当我需要使用它时,我从数据库中读取字符串,并将其转换为数组(反之亦然,以便将其存储回)。
UPDATE:显然有两个可行的选项:1)使用我上面描述的将数组存储为字符串的方法,2)创建另一个MySQL表来存储问答id/用户id对。在这一点上,我想知道哪种解决方案更快,如果网站变得流行。使用第一个选项,我将有额外的工作将字符串转换为数组并返回,但之后我将在一个小数组上搜索(即,只包含单个用户进行的测验)。使用MySQL解决方案,我不需要来回转换字符串,但我需要在更大的数据集上搜索(即所有用户进行的所有测验)。对于大量用户(例如1000),有没有猜测哪种方法更快?
如果您使用MySQL之类的东西,请尝试类似的表结构:
表:用户user_id | user_name
表:测验quiz_id | quiz_name
表:quiz_takentaken_id | user_id (FK) | quiz_id (FK) | timestamp
在测验表中为每次参加测验添加一个条目。此外,您还可以添加更多的柱来存储更多的详细信息。
这个解决方案对我来说似乎没问题。或者你可以在中间有一个"quizs"表和一个users_to_quizs表,外键链接到用户和quizs。它更符合关系数据库标准,但对于您想要做的事情来说,它似乎有点复杂!
我会坚持你的解决方案!(你使用PHP吗?>在这种情况下使用内爆/爆炸,你会很快得到你想要的!:-)
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完美工作