使用MySQL数据库中的重复信息列来避免进行额外的查询

时间:2016-02-05 04:44:20

标签: php mysql laravel

我有当前的设置:

我的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
);

我的testsquestions数据透视表:

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

Testsquestions可能有不同的所有者/提交者。

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_iduser_id列,因为我可以通过查询attempts表来找出ID。

好消息是:它可以更轻松地找到单个answers的所有question并生成一些统计信息。对于单个answers,您还可以更轻松地找到所有user并生成更多统计信息。

坏事:在阅读关系数据库时,我看到某个地方你不应该在表中重复信息,因为这是数据库关系的目的)

我目前正在使用Laravel5来实现整个系统,而且我对PHP和Laravel5来说还是一个新手。

我试图始终使用Eloquent ORM来处理我的数据库,因为它使更新条目更容易

在我脑海中思考这个问题':

为了找出answers的正确user的百分比,我必须查询每个attempt,然后从answers查询attempts {1}}然后查询questions表以找出正确的答案。

是否有正确/有效的方法来解决此问题,避免多个/大查询/复杂查询? (我希望我尽可能清楚地表达一切,我真的想避免实施某些事情并且不得不重做所有内容)

编辑:我试图解决的主要问题

我想尽可能多地使用Eloquent ORM(它允许我定义自定义函数,感觉更像OOP,我以前更习惯)

我可以使用查询构建器,完全避免在我的数据库中需要user_idquestion_id因为我可以使用attempt_id加入表格但我不会使用雄辩(这不是一个大问题,但这不是我想要的)。

我仍然可以使用Eloquent ORM,但似乎效率更低。我正在考虑这种情况:

我想知道user有多少正确答案:

如果我有user_id列,这是一个简单的查询,只需要选择answer的每个user_id = x

如果我没有user_id,我需要查询用户的每个attempt,然后查询与answers相关的attempt。 (这里是问题',除了将这些列添加到我的架构之外,有没有办法使用Eloquent ORM有效地解决这种情况?)

0 个答案:

没有答案