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

Php 在MySQL数据库中使用重复信息列以避免进行额外查询,php,mysql,laravel,Php,Mysql,Laravel,我有当前设置: 我的测试表: 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 ); user

我有当前设置:

我的
测试
表:

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
);
user\u id:
是提交测试的用户

CREATE TABLE IF NOT EXISTS `tests` (
    `id` int(10) unsigned NOT NULL,
    `user_id` int(10) unsigned NOT NULL
);

我的
尝试次数
表:

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
);
user\u id:
是启动测试的用户

CREATE TABLE IF NOT EXISTS `tests` (
    `id` int(10) unsigned NOT NULL,
    `user_id` int(10) unsigned NOT NULL
);
last\u answered\u问题:
是用户回答的最后一个问题的索引

finished:
如果用户完成了测试(此列的存在只是为了简化测试)


我的
用户
表:

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

我的
问题
表:

user\u 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
);

以及我的
测试
问题
透视表:

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

让我解释一下:

测试基本上是一组
问题

一个
问题
可能属于许多
测试

测试
问题
可能有不同的所有者/提交者

尝试
表跟踪
用户当前正在执行的
测试
。如果相同的
测试没有未完成的
尝试
,则
用户
只能开始新的
尝试

我没有包含使一切变得更干净的键(它们在我的数据库模式中的设置是正确的)

编辑:

questions
表中的
information
列只是JSON信息:问题本身、可能的答案以及正确的答案索引/编号

答案
表中的
所选答案
用户在尝试完成
测试时选择为正确答案的索引/编号

我之所以选择使用JSON,是因为我并不认为有必要添加另一个表来获取问题中可能的答案

信息
列如下所示:

{
    "question": "What's the first letter of the alphabet?",
    "possibleAnswers": [
        "A",
        "B",
        "C",
        "D"
    ],
    "correctAnswer": "0"
}

我遇到的问题是设计
答案
表。我想到的第一个模式是这样的:

{
    "question": "What's the first letter of the alphabet?",
    "possibleAnswers": [
        "A",
        "B",
        "C",
        "D"
    ],
    "correctAnswer": "0"
}
selected\u答案:
是用户对该问题的答案(我不确定如何实现)

我正在考虑是否应该添加
question\u id
user\u id
列,因为我可以通过查询
truments
表来找到id

好处是:对于单个
问题
可以更容易地找到所有
答案
,并生成一些统计数据。对于单个
用户
查找所有
答案
并生成更多统计信息也会更容易

坏处:在阅读有关关系数据库的文章时,我发现不应该在表中重复信息,因为这是数据库关系的目的)

我目前正在使用Laravel5来实现整个系统,我对PHP和Laravel5非常陌生

我一直在尝试使用雄辩的ORM来处理我的数据库,因为它使更新条目更加容易


思考这个“问题”时我脑海中闪过的事情:

为了找出
用户的
正确答案的百分比
,我必须查询每个
尝试
,然后从这些
尝试
中查询
答案
,然后查询
问题
表以找出正确答案

有没有正确/有效的方法来解决这个问题,避免多个/大查询/复杂查询?(我希望我把一切都说得尽可能清楚,我真的想避免实施“坏”的东西,而不得不重做一切)


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

我希望尽可能多地使用雄辩的ORM(它允许我定义自定义函数,感觉更像是OOP,我更习惯于这样)

我可以使用查询生成器,完全避免在我的数据库中使用
user\u id
question\u id
,因为我可以使用
trunt\u id
连接表,但我不会使用Eloquent(这不是一个大问题,但这不是我想要的)

我仍然可以使用雄辩的ORM,但它似乎效率要低得多。我在想这种情况:

我想知道一个
用户
有多少正确答案:

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


如果我没有
用户id
,我需要查询用户所做的每一次
尝试
,然后查询与每一次
尝试
相关的
答案。(这里是“问题”,除了将这些列添加到我的模式之外,还有没有其他方法可以使用雄辩的ORM有效地解决这种情况?

我注意到的第一件事是在表创建中没有
外键
子句。此外,您还需要在要查询的列上定义索引。如果您正确设置了索引和外键结构,则联接不会引起问题,您可以从
答案
列中省略一些内容。@miken32我实际上忘记了在问题描述中包含键(它们在我的数据库架构中的设置是正确的)。我使用phpmyadmin导出,因此添加密钥的代码实际上位于文件的底部(希望有意义)。@RyanVincent我不确定是否理解您的意思,但我添加
user\u id
question\u id
列的唯一原因是为了简化查询(因为它们永远不会改变)因为我可以使用
尝试id
找到它们,但为了做到这一点,我需要执行另一个查询或进行更复杂的查询(这不是一个问题)。这不是设计查询来查找东西。这是一个关于关系的问题。即,哪些实体直接相互连接。IMO,Specific