16

我正在尝试实施多项选择测验,并希望将我所有的问题和答案存储在 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会被索引?意味着搜索时间会因为必须搜索整个表而增加?answerIDquestionID

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

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

4

2 回答 2

11

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

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

模式 1 只会让生活变得非常艰难。

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

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

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

于 2012-04-10T03:44:13.107 回答
3

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

It's better to create a bit type column in answers table to marked the correct answer and remove correctAnswerID column.

于 2017-10-31T04:40:24.497 回答