我正在尝试实施多项选择测验,并希望将所有问题和答案存储在SQLite数据库中。我会有很多问题,每个问题都会有两个或更多可能的答案显示出来。
我的问题是,我该如何将问题和答案存储在数据库中?我有两个架构的想法(粗体的主键)
问题( 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
表所需的额外空间,我认为重叠量不会意味着存储更少的数据
答案 0 :(得分:8)
你是第二个架构是更好的架构,因为它模拟了实际域:每个问题都有一组答案。即使您可以通过存储一次重复的答案来“压缩”数据,但与实际的域不匹配。
在路上你会想要编辑答案。使用模式1,这意味着首先搜索该答案是否已存在。如果它确实存在,那么您将不得不检查是否有任何问题仍然依赖于旧的答案。如果它不存在,您仍然需要检查是否有任何其他问题依赖于该答案,然后编辑该答案或创建新答案。
架构1只会让生活变得非常困难。
要回答索引问题,您需要在questionId上添加索引。获得该索引后,查找问题的答案应该缩放。
现在,在一个完全不同的说明中,为什么要使用数据库呢? 考虑以json等标准格式存储它们作为简单文档。无论何时查询问题,您几乎总是想要答案,反之亦然。您可以一步加载整个文档,而不是执行多个查询。
如果您发现需要更高级的存储(查询,冗余等),您可以转移到MongoDB或CouchDB等文档数据库。
答案 1 :(得分:1)
似乎死锁(循环循环),因为 questionID 列在答案表中被称为外键, correctAnswerID 列被称为外键在问题表中。
最好在答案表中创建一个位类型列,以标记正确的答案并删除 correctAnswerID 列。