我有当前的设置:
我的tests
表:
user_id:
是提交测试的用户
CREATE TABLE IF NOT EXISTS `tests` (
`id` int(10) unsigned NOT NULL,
`user_id` int(10) unsigned NOT NULL
);
我的attempts
表:
user_id:
是启动测试的用户
last_answered_question:
是用户回答的最后一个问题的索引
finished:
如果用户完成测试(此列仅存在以使事情变得更容易)
CREATE TABLE IF NOT EXISTS `attempts` (
`id` int(10) unsigned NOT NULL,
`user_id` int(10) unsigned NOT NULL,
`test_id` int(10) unsigned NOT NULL,
`last_answered_question` int(10) unsigned NOT NULL,
`finished` tinyint(1) NOT NULL
);
我的users
表:
CREATE TABLE IF NOT EXISTS `users` (
`id` int(10) unsigned NOT NULL,
`type` varchar(255) NOT NULL DEFAULT 'user',
`name` varchar(255) NOT NULL,
`email` varchar(255) NOT NULL,
`password` varchar(60) NOT NULL
);
我的questions
表:
user_id:
是提交问题的用户
CREATE TABLE IF NOT EXISTS `questions` (
`id` int(10) unsigned NOT NULL,
`user_id` int(10) unsigned NOT NULL,
`information` text COLLATE utf8_unicode_ci NOT NULL
);
我的tests
和questions
数据透视表:
CREATE TABLE IF NOT EXISTS `question_test` (
`id` int(10) unsigned NOT NULL,
`test_id` int(10) unsigned NOT NULL,
`question_id` int(10) unsigned NOT NULL
);
让我解释一些事情:
test
基本上是questions
。
question
可能属于许多tests
。
Tests
和questions
可能有不同的所有者/提交者。
attempts
表跟踪tests
当前正在执行的user
。如果同一user
没有未完成的attempt
,则attempts
只能开始新的test
。
我没有包含密钥以使所有内容更清晰(他们在我的实际数据库架构上设置正确)
修改
information
表中的questions
列只是JSON信息:问题本身,可能的答案以及正确的答案索引/数字。
chosen_answer
表中的answers
,是user
在尝试完成test
时选择的正确答案的索引/编号。
我之所以选择使用JSON是因为我没有真正看到需要添加另一个表格来解决问题中的可能答案。
information
列看起来像这样:
{
"question": "What's the first letter of the alphabet?",
"possibleAnswers": [
"A",
"B",
"C",
"D"
],
"correctAnswer": "0"
}
我遇到的问题是设计answers
表。我认为的第一个架构是这样的:
chosen_answer:
是用户对问题的回答(我不确定我将如何实施此问题)
CREATE TABLE IF NOT EXISTS `answers` (
`id` int(10) unsigned NOT NULL,
`chosen_answer` varchar(1) NOT NULL,
`user_id` int(10) unsigned NOT NULL,
`question_id` int(10) unsigned NOT NULL,
`attempt_id` int(10) unsigned NOT NULL
);
我正在考虑是否应添加question_id
和user_id
列,因为我可以通过查询attempts
表来找出ID。
好消息是:它可以更轻松地找到单个answers
的所有question
并生成一些统计信息。对于单个answers
,您还可以更轻松地找到所有user
并生成更多统计信息。
坏事:在阅读关系数据库时,我看到某个地方你不应该在表中重复信息,因为这是数据库关系的目的)
我目前正在使用Laravel5来实现整个系统,而且我对PHP和Laravel5来说还是一个新手。
我试图始终使用Eloquent ORM来处理我的数据库,因为它使更新条目更容易
在我脑海中思考这个问题':
为了找出answers
的正确user
的百分比,我必须查询每个attempt
,然后从answers
查询attempts
{1}}然后查询questions
表以找出正确的答案。
是否有正确/有效的方法来解决此问题,避免多个/大查询/复杂查询? (我希望我尽可能清楚地表达一切,我真的想避免实施某些事情并且不得不重做所有内容)
编辑:我试图解决的主要问题
我想尽可能多地使用Eloquent ORM(它允许我定义自定义函数,感觉更像OOP,我以前更习惯)
我可以使用查询构建器,完全避免在我的数据库中需要user_id
和question_id
因为我可以使用attempt_id
加入表格但我不会使用雄辩(这不是一个大问题,但这不是我想要的)。
我仍然可以使用Eloquent ORM,但似乎效率更低。我正在考虑这种情况:
我想知道user
有多少正确答案:
如果我有user_id
列,这是一个简单的查询,只需要选择answer
的每个user_id = x
。
如果我没有user_id
,我需要查询用户的每个attempt
,然后查询与answers
相关的attempt
。 (这里是问题',除了将这些列添加到我的架构之外,有没有办法使用Eloquent ORM有效地解决这种情况?)