帮助数据库设计和应用程序逻辑

时间:2011-08-11 14:36:27

标签: database-design

我正在尝试为多个用户设置的多项选择测试设置数据库。我在设置数据库和应用程序逻辑时遇到了困难。

这就是我看到应用程序的行为:

  1. 用户开始测试并回答任意数量的问题(应随机挑选问题)。
  2. 用户看到的问题不应该是同一用户之前正确回答的问题。
  3. 以下是我设置数据库的方法:

    database

    所以我的问题是:

    1. 我的数据库是否设置正确,以满足上述要求?
    2. 向用户显示问题的最佳方式是什么(请记住上述要求)?我是否应该获得在数组中正确回答的所有问题,然后在另一个数组中获取所有现有问题,并从第二个数组中排除第一个数组,并将生成的数组洗牌?我认为这种方式根本不高效。
    3. 由于

1 个答案:

答案 0 :(得分:0)

只要您只有一个测试,并且只要您不想记录用户的答案,只要他们是否正确,您的架构几乎可以正常工作。我看到的一个问题是我无法看到正确答案的记录位置。如果用户选择正确答案,系统将如何知道?

另外,有些人可能会对你的问题表有一点担心,这些表有非标准化的答案。另一种方法是使用这样的答案表:

answers
( id,
  question_id,
  sequence,
  answer_value
)

这样做的好处是,每个问题你可以得到任意数量的答案,如果需要更多答案的问题,你不需要补充额外的错误答案或改变你的系统。

另请注意,如果您使用此方法,那么您的问题表还应该指出哪个答案是正确答案,例如“correct_answer_id” - 如果您在参与者中实施了参照完整性,那么这种类型的关系很难管理。数据库,由于鸡和蛋的问题,所以你需要一些应用程序代码来确保每个问题都有答案,答案不是针对不同的问题!

您在帖子中没有提到这一点,但stats.is_answered_correctly可以让您避免向用户显示他们出错的问题,以及他们正确的问题。如果您只想知道用户哪些问题是正确的,并且准备多次向他们展示相同的问题,直到他们做对了,那么您实际上并不需要“is_answered_correctly”属性。相反,仅仅存在交集记录就会告诉您问题已得到正确回答。

在挑选问题方面,有两种方法可以解决问题。如果你有比任何单个用户都要回答的问题更多的问题,那么你可以随机选择一个问题,检查他们是否碰巧已经回答了问题,如果是,请返回并获得另一个问题。如果问题集比答案集大得多,则碰撞概率非常低,你应该没问题。

如果您的问题集不比您的答案集大得多,您可以改为制作未回答问题的工作清单。这将涉及包含用户与每个问题的配对的交集表。当用户首次注册时,您将构建一次。当您提出问题时,您可以从此工作清单表中与该用户相关的问题中随机选择一个问题。当用户获得正确的问题时,您删除交集记录,以便不再询问问题。这非常有效,但在从工作列表表中随机选择一个之前,它需要数据库调用来计算特定用户的未答复问题的数量。