考试iOS应用的核心数据模型

4

我正在开发一款用于考试的iOS应用程序,并希望在继续之前确保我的模型正确。

我发现这篇文章非常有帮助:

使用什么mysql数据库表和关系可以支持具有条件问题的问答调查?

我只是想要一些有关为Core Data实现简化版本的建议。

以下是我的一些假设:

  • 每个用户只能参加一次测试
  • 每个用户在参加测试时只有一组答案
  • 每个测试只有一个用户
  • 每个问题都有多个答案

这是我的Core Data模型:

enter image description here

问题:

  • 这个模型是否准确反映了我的假设?
  • 是否需要Test_QuestionsUser_Answers
    • 理论上,我可以直接在TestQuestion之间建立关系吗?Test -->> Question
  • 对改进有何建议将不胜感激。
3个回答

2
您应该能够删除TEST_QUESTIONS和USER_ANSWERS表。目前TEST_QUESTIONS和TEST以及USER_ANSWERS和USER之间存在一对一的映射,但实际上这没有什么意义。
理论上,您也可以合并TEST和USER,因为它们也是一对一的关系,但有人可能会认为它们是独立的关注点,应该各自拥有一个表。
另外,虽然设计符合测试只属于单个用户的假设,但您确定这就是您想要的吗?这意味着测试只能与单个用户相关联。
如果是这样,您可以进行另一种简化。您可以向ANSWER表添加一个字段,例如“wasSelectedByUser”,并删除USER和ANSWERS之间的关系,因为您将能够从USER到TEST到QUESTION到ANSWER导航并确定用户选择了什么。
可能的简化如下图所示: Possible simplification

0

你提出的模型确实反映了你的假设,但正如其他人指出的那样,Test_questions和User_Answers是不必要的,因为它们分别映射到Test和User。

但是(再次,正如其他人所说),我会重新考虑是否只想让每个用户进行一次测试,每个测试只有一个用户。事实上,你的假设包括“每个用户对于所参加的测试只有一组答案”,这意味着可能会有多次测试。为了适应这种情况,我会添加一个中间实体Attempt,记录用户、测试、日期等详细信息。通过从User到Attempt和从Test到Attempt建立一对多关系,你可以允许a)多个用户参加同一测试,b)任何用户都可以进行多次尝试,尝试不同的测试或多次尝试相同的测试。我还会在Test中添加testName属性,在Question中添加questionTitle属性,以便在tableViewCells等地方使用。

虽然不在您的假设中,但您的模型目前要求任何一个问题只能出现在一个测试中。我建议改变这一点:您可以通过从题库中随机选择来生成不同的测试。但这确实需要另一个实体,“TestQuestionDetails”,它从测试和问题中具有一对多的关系,可以记录诸如问题编号之类的细节。再次,正如其他人建议的那样,我会将您在问题上的类别属性转换为单独的实体。这将允许您添加一个属性,例如“sortIndex”,以便您可以按照自己的意愿对类别进行排序(您可能不希望按字母顺序排列)。

最终结果如下:

DataModel


0

你可以使用你定义的模型,但在验证阶段时可能会有些棘手,以确定用户是否通过了测试,因此我建议你进行以下简化(我没有考虑字段,只考虑实体以快速完成):

Another model

使用这个模型,当您的用户验证他的测试时,您只需要像这样进行一次迭代:
for(Answer* a in answers)
{
   Question *q = a.question;

   if(a.isCorrect)
   {  
      // ... increment counter by questions ..
      // ... check with corresponding question by using variable 'q'
   }
}

我建议您添加一个新的实体Category,这可能对于在UI中向用户显示表单(例如使用UITableView)非常有用。通过这种方式,您的表格数据源将是类别列表,您的部分标题将是类别名称,而您的单元格将是问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接