Database design 选择题测验引擎的良好数据库模式设计是什么?
我有一个项目要创建一个asp.NETMVC站点来生成一个测验。 规格如下:Database design 选择题测验引擎的良好数据库模式设计是什么?,database-design,Database Design,我有一个项目要创建一个asp.NETMVC站点来生成一个测验。 规格如下: 对于访问站点的每个用户,她/他都会得到一个测验 每个测验都包含一些选择题 每个问题包含一个问题和5个相互排斥的选项 我能想到的最简单的模型如下: public class Problem { public int ProblemId { get; set; } public string Question { get; set; } public strin
public class Problem
{
public int ProblemId { get; set; }
public string Question { get; set; }
public string A { get; set; }
public string B { get; set; }
public string C { get; set; }
public string D { get; set; }
public string E { get; set; }
}
Quiz (int QuizId, ...)
Problem (int ProblemId, int QuizId, string Question)
Answer (int AnswerId, int ProblemId, int Index, string Answer)
我不确定它是否好。
你能给我一个更好的设计建议吗?从a到E的属性?不,谢谢!我会把我的桌子布置如下:
public class Problem
{
public int ProblemId { get; set; }
public string Question { get; set; }
public string A { get; set; }
public string B { get; set; }
public string C { get; set; }
public string D { get; set; }
public string E { get; set; }
}
Quiz (int QuizId, ...)
Problem (int ProblemId, int QuizId, string Question)
Answer (int AnswerId, int ProblemId, int Index, string Answer)
字段名称应该是自解释的(索引是单个问题答案的排序索引,如果它们的顺序很重要的话)简单直观的设计总是最好的,因为它们非常简单,我们开始怀疑自己;-)。你做得很好,除了你还可以将正确答案与问题本身一起存储。那么这就不再只是一个问题了。所以现在是问题和答案或是问题
因此,将这些内容作为多个列存储在一个表中是可以的但你也需要理解它的含义。这意味着你正在做一个假设,即一个问题总是有5个选择。如果少于5,则可以存储空值。但是如果你想要更多呢?此时,单表模型开始崩溃。现在,您可能会开始认为一个问题实际上可以有1个或多个选择,并希望拆分为父子表……现在您已经做出了一个明智的决定;-) 表格
问题
有一个id
和一个说明
,这是问题的文本(“猫是狗吗?”)
编辑:此外,问题
表中有一个正确答案id
,它对应于答案
表中的正确行
表Answer
有一个question\u id
,将其链接回其question
,还有一个description
,这是答案的文本(“它取决于您的猫的颜色”)
使用此模式,问题没有硬编码的答案数。我正在处理相同类型的数据库结构。最好有一个选项表来插入针对特定问题id的选项。测验id是一个单独的表,其中包括问题id和测试持续时间。“堆栈溢出”?这个网站已经变得有意识了,并且也在问问题?我很惊讶有人之前没有得到这个用户名。我几乎要投他的票了。你能为每个答案选择一个以上的选项吗?@JK:这只是第一步。当它学到足够的知识后,它也会开始回答问题。@Adam Gent:它说的是“相互排斥的选择”。所以,不,我不知道。将模式限制为五个答案似乎不好。当然,它可能完全符合要求(今天),但如果只是稍微多一些通用性,而不是太多的复杂性成本,我会使它更灵活。尽管如此,保持要求的简单性(以一点间隔为模数)是一个很好的原则。加上一个问题字段以获得正确答案。或者,如果在显示问题时仍要对其进行洗牌(但不要在隐藏字段中直接使用问题id,否则用户将开始作弊),则可以对其进行硬编码,使第一个答案始终正确。或者,在一个字段中输入一个答案,以将其标记为正确(这将允许扩展系统,以处理具有多个正确答案的问题)。