在数据库中存储多项选择测验 - 确定模式
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(questionID、answerID)
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列。
【讨论】:
以上是关于在数据库中存储多项选择测验 - 确定模式的主要内容,如果未能解决你的问题,请参考以下文章