我正在构建一个用于测试的iOS应用程序,我想在继续之前确定我的模型。
我发现这篇文章非常有帮助:
What mysql database tables and relationships would support a Q&A survey with conditional questions?
我只想提供一些关于为Core Data实现简化版本的建议。
以下是我的一些假设:
这是我的核心数据模型:
问题:
Test_Questions
和User_Answers
?
Test
和Question
之间建立关系? Test -->> Question
答案 0 :(得分:2)
您应该能够删除TEST_QUESTIONS和USER_ANSWERS表。目前TEST_QUESTIONS和TEST之间存在一对一的映射关系,而USER_ANSWERS和USER实际上没有任何用途。
理论上,您也可以将TEST和USER结合起来,因为它们也是一对一的,但有人可能会认为它们是单独的问题,每个都应该有一个表格。
此外,虽然设计确实符合您对具有单个用户的测试的假设,但您确定这是您想要的吗?这意味着测试只能与单个用户相关联。
如果是这种情况,您可以进行另一次简化。您可以在ANSWER表中添加一个字段,例如" wasSelectedByUser"并删除USER和ANSWERS之间的关系,因为您可以从USER导航到TEST到QUESTION到ANSWER并确定用户选择的内容。
答案 1 :(得分:0)
您可以使用您定义的模型,但在验证阶段可能有点棘手,要知道用户是否通过了测试,因此我建议您进行以下简化(我没有' t考虑字段,但只考虑快速实现的实体):
使用此模型,当您的用户验证他的测试时,您可以像这样进行一次迭代:
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”之类的属性,以便您可以根据需要对类别进行排序(您可能不希望按字母顺序排序)。
最终结果如下: