用于测试的核心数据模型采用iOS App

时间:2014-09-27 00:13:38

标签: ios objective-c core-data database-design database-schema

我正在构建一个用于测试的iOS应用程序,我想在继续之前确定我的模型。

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

What mysql database tables and relationships would support a Q&A survey with conditional questions?

我只想提供一些关于为Core Data实现简化版本的建议。

以下是我的一些假设:

  • 每个用户可以进行一次测试
  • 每个用户每次测试都有一组答案
  • 每个测试都有一个用户
  • 每个问题都有很多答案

这是我的核心数据模型:

enter image description here

问题:

  • 这个模型是否准确反映了我的假设?
  • 是否需要Test_QuestionsUser_Answers
    • 理论上,我可以直接在TestQuestion之间建立关系? Test -->> Question
  • 非常感谢任何有关改进的建议。

3 个答案:

答案 0 :(得分:2)

您应该能够删除TEST_QUESTIONS和USER_ANSWERS表。目前TEST_QUESTIONS和TEST之间存在一对一的映射关系,而USER_ANSWERS和USER实际上没有任何用途。

理论上,您也可以将TEST和USER结合起来,因为它们也是一对一的,但有人可能会认为它们是单独的问题,每个都应该有一个表格。

此外,虽然设计确实符合您对具有单个用户的测试的假设,但您确定这是您想要的吗?这意味着测试只能与单个用户相关联。

如果是这种情况,您可以进行另一次简化。您可以在ANSWER表中添加一个字段,例如" wasSelectedByUser"并删除USER和ANSWERS之间的关系,因为您可以从USER导航到TEST到QUESTION到ANSWER并确定用户选择的内容。

Possible simplification

答案 1 :(得分:0)

您可以使用您定义的模型,但在验证阶段可能有点棘手,要知道用户是否通过了测试,因此我建议您进行以下简化(我没有' t考虑字段,但只考虑快速实现的实体):

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)。有了这个,您的表格的数据源将分类'列表,您的部分标题将是您的类别名称,您的单元格将成为问题。

答案 2 :(得分:0)

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

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

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

最终结果如下:

DataModel