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