在数据库中存储多项选择测验 - 确定模式

Posted

技术标签:

【中文标题】在数据库中存储多项选择测验 - 确定模式【英文标题】:Storing a multiple choice quiz in a database - deciding the schema 【发布时间】:2012-04-10 03:25:20 【问题描述】:

我正在尝试实施多项选择测验,并希望将我的所有问题和答案存储在 SQLite 数据库中。我会有很多问题,每个问题都会显示 2 个或更多可能的答案。

我的问题是,我应该如何将问题和答案存储在数据库中?我对架构有两个想法(主键以粗体显示)

    as(多对多)

问题 (questionID:int , questionString:String, correctAnswerID:int)

答案(answerID:int , answerString:String)

questions_and_answers(questionIDanswerID

2.

问题(questionID:int、questionString:String、correctAnswerID:int)

答案(answerID:int, answerString:String, questionID:int 外键

我不确定哪个更好,或者是否有其他方法?

也许questions_and_answers 会变得非常大并导致较长的检索时间和内存问题?再说一次,我假设 question_and_answers 将在主键上被索引。在第二个模式中,answers 将在answerID 而不是questionID 上被索引?意味着搜索时间会因为必须搜索整个表而增加?

可能有大约 10,000 - 20,000 个答案。 (测验可以在移动设备上运行,问题需要“即时”显示)

注意:我预计问题之间的答案不会有太多重叠。考虑到questions_and_answers 表所需的额外空间,我认为重叠量不会意味着存储的数据更少

【问题讨论】:

你的答案真的有可能被多个问题重复吗? 粗略猜测,我会说可能 30% 的答案会出现在多个问题中 【参考方案1】:

您的第二个架构更好,因为它模拟了实际领域:每个问题都有一组答案。即使您可以通过存储一次重复的答案来“压缩”数据,它与实际的域不匹配

接下来您会想要编辑答案。对于模式 1,这意味着首先搜索该答案是否已经存在。如果确实存在,那么您将不得不检查是否有任何问题仍然依赖于旧答案。如果它不存在,您仍然需要检查是否有任何其他问题依赖于该答案,然后就地编辑该答案或创建一个新答案。

Schema 1 让生活变得非常艰难。

要回答索引问题,您需要在 questionId 上添加索引。获得该索引后,查找问题的答案应该可以扩展。

现在,换一种说法,为什么要为此使用数据库? 考虑将它们存储为简单文档,以标准格式(如 json)。每当您查询一个问题时,您几乎总是想要答案,反之亦然。无需执行多个查询,您可以一步加载整个文档。

如果您随后发现需要更高级的存储(查询、冗余等),您可以迁移到 MongoDB 或 CouchDB 等文档数据库。

【讨论】:

我刚才在考虑如何删除一个问题,并意识到在模式 1 上会更加困难。模式 2 现在对我来说更有意义了!我想我会使用数据库,因为我认为搜索/管理/存储/编辑问题会更容易。我从来没有想过将它们存储为文档 - 你认为它会提供明显更好的性能吗?谢谢你的回答 如果您对数据的使用符合我的预期,那么基于文档的解决方案可以轻松获得更好的性能。与(问题 + 答案)相比,文档解决方案将只有 1 个查找(文档)。【参考方案2】:

似乎死锁(循环),因为 questionID 列在 answers 表中被称为外键,而 correctAnswerID 列被称为外键在问题表中。

最好在答案表中创建一个位类型的列来标记正确答案并删除correctAnswerID列。

【讨论】:

以上是关于在数据库中存储多项选择测验 - 确定模式的主要内容,如果未能解决你的问题,请参考以下文章

如何在多项选择(mcq)测验中显示正确/错误的符号

在谷歌表单上自动生成多项选择测验

Google 表单作为多项选择测验 - 如何提供结果

如何使用 PHP、MySQL 和 Jquery 创建测验

Android中的AlertDialog使用示例四(多项选择确定对话框)

在 MySQL 中选择随机行