在数据库中存储多项选择测验 - 决定架构

Ada*_*ers 13 sql database database-design

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

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

  1. 作为(多对多)

问题(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表格所需的额外空间,我认为重叠量不会意味着存储的数据更少

Chr*_*man 8

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

在路上你会想要编辑答案.使用模式1,这意味着首先搜索该答案是否已存在.如果它确实存在,那么您将不得不检查是否有任何问题仍然依赖于旧的答案.如果它不存在,您仍然需要检查是否有任何其他问题依赖于该答案,然后编辑该答案或创建新答案.

架构1只会让生活变得非常困难.

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

现在,在完全不同的说明中,为什么要使用数据库呢?考虑将它们存储为 json等标准格式的简单文档.无论何时查询问题,您几乎总是想要答案,反之亦然.您可以一步加载整个文档,而不是执行多个查询.

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