2012-04-10 106 views
12

我想实现一个多项选择测验,并希望将所有问题和答案存储在SQLite数据库中。我会有很多问题,每个问题都会有2个或更多可能的答案来显示。在数据库中存储多项选择测验 - 决定模式

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

  1. 为(多对多)

问题(questionID:INT,questionString:字符串,correctAnswerID:INT)

答案(answerID:INT,answerString:字符串)

questions_and_answers(questionIDanswerID

2.

问题(questionID:INT,questionString:字符串,correctAnswerID:INT)

答案(answerID:INT,answerString:字符串,questionID: int 外键

我不确定哪一个更好,或者如果有其他方法?

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

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

注意:我不认为问题之间的答案会有太多重叠。考虑到questions_and_answers

+0

你的答案是否真的可能在多个问题上被重复? – Tenner 2012-04-10 03:37:19

+0

粗略推测,我会说可能有30%的答案会出现在多个问题 – 2012-04-10 03:42:05

回答

7

要求的额外空间,我不认为重叠的数量意味着存储的数据更少。您是第二种模式,因为它模拟了实际的域:每个问题都有一个一组答案。即使您可以通过存储重复答案一次来“压缩”数据,但它与实际域不匹配。

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

模式1让生活变得非常困难。

要回答您的索引问题,您需要在questionId上添加一个索引。一旦你有了这个索引,查找问题的答案应该缩放。

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

如果您后来发现需要更高级的存储空间(查询,冗余等),您可以将其移动到像MongoDB或CouchDB这样的文档数据库。

+0

我刚才想到如何去删除一个问题,并意识到它会在模式1上更难。模式2使更多现在感觉到我了!我以为我会使用数据库,因为我认为搜索/管理/存储/编辑问题会更容易。我从来没有想过将它们存储为文档 - 您认为它会提供明显更好的性能吗?感谢您的回答 – 2012-04-10 03:58:08

+1

如果您对数据的使用情况与我预期的相同,那么基于文档的解决方案可以轻松执行得更好。与(问题+答案)相比,文档解决方案只有1个查找(文档)。 – 2012-04-10 04:17:45

-1

看来僵局(圆环)为questionID列在称为外键接听表和correctAnswerID列在问题表称为外键。

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