sql - 在数据库中存储多项选择测验 - 决定模式

标签 sql database database-design

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

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

  1. 作为(多对多)

问题(questionID:int , questionString:String, correctAnswerID:int)

答案(answerID:int , answerString:String)

questions_and_answers(questionIDanswerID)

2.

问题(questionID:int, questionString:String, correctAnswerID:int)

answers (answerID:int, answerString:String, questionID:int 外键)

我不确定哪个更好,或者是否有其他方法?

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

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

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

所需的额外空间,我不认为重叠量意味着存储的数据更少

最佳答案

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

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

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

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

现在,换一种说法,为什么要为此使用数据库? 考虑将它们存储为像 json 这样的标准格式的简单文档。任何时候你问一个问题,你几乎总是想要答案,反之亦然。您可以一步加载整个文档,而不是执行多个查询。

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

关于sql - 在数据库中存储多项选择测验 - 决定模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10082751/

相关文章:

mysql - Select 语句结果带空格和不带空格

sql - Google Big Query SQL - 获取最新的列值

mysql - 我应该在哪里保存在 WebMatrix 中创建的数据库,以便它们与不是在同一程序中开发的网站一起使用?

java - 是否应该将模型列表放入另一个模型中?

sql - 需要根据从表中提取的信息将行插入表中

algorithm - 图形中是否有类似于mipmaps的数据存储模式?

sql - 使用从另一列填充的数据更改表添加列

mysql - SQL查询过程: adding new column based on select query

database - 如何使用 Vertica Database Designer 创建特定于查询的投影?

php - 计算 PHP 中的访问者并保存到数据库