小编典典

数据库规范化:如何将数据制成表格?

sql

我的问题是关于数据标准化。

信息

我正在尝试将数据库中的测试结果制成表格。我要记录的信息是test_instance,user_id,test_id,完成(日期/时间),(测试时间),分数,不正确的问题和已复习的问题。

在大多数情况下,我认为我是根据表1来组织信息的,但是我想尽办法找出记录错误或已审查问题的最佳方法有些不为所动。请注意,我 不要
希望把所有不正确的问题集中在一个条目按表2。

我想为每个标记错误的问题(或复习的问题)单独输入一个条目。

注意:已 复习的问题是一次或两次被错误标记的问题,因此需要再次进行测试。

表格1

-------------------------------------------------------------   
|  instance   | user_id | test_id |completed |duration|score|   
-------------------------------------------------------------   
|      1      |   23    |   33    | 2JAN2012 |  20m   |  75 |   
|      2      |   11    |   12    | 10DEC2011|  35m   | 100 |   
|      3      |   1     |    3    | 3JUL2008 |  1m    |   0 |   
|      4      |   165   |   213   | 4SEP2010 |  10m   |  50 |   
-------------------------------------------------------------

表2

------------------------
|  instance   ||wrong Q|
------------------------
|      1      || 3,5,7 |
------------------------

最终,我想知道随着时间的流逝,用户有多少次将某个特定问题弄错了。另外,我需要跟踪错误测试来自哪个测试。对于已审查的问题也是如此。顺便说一句,有可能在同一情况下对问题进行复查和发现错误。

我想出了两种不同的方式来表示数据,但我都不喜欢它们中的任何一种。

------------------------------------------------- 
|  instance   | Q number |  Wrong  |  Reviewed  |
-------------------------------------------------

或者

---------------------------------------------------
| user_id | test_id | Q number | Wrong | Reviewed |
---------------------------------------------------

注意:错误/已审核类别正在计算Q号落入该类别的次数。

我的问题汇总

如何有效地在表格中表示错误/复习的问题?表1是否设置有效?

编辑:
已被错误回答的问题可用于生成新的测试。测试只会使用不正确的问题。如果进行了生成的测试,则测试的问题将被标记为已复习。分数不会被更新,因为它将是一个新测试并且将生成一个新的test_id。

注意 -可以重新参加旧的考试,但分数不会更新。将为进行的每个测试创建一个新实例。

关于生成的测试,我想这意味着我将需要再包含一个表来跟踪最初来自哪个测验的问题。抱歉-我一直都没有想到。

谢谢

我很难选择答案,因为每个人都给了我非常有用的信息。我的最终设计将考虑您所说的一切。再次感谢。


阅读 213

收藏
2021-04-28

共1个答案

小编典典

谈到规范化,只是为了确保您可以从数据库中检索所有类型的计算数据,我将提出一个更复杂的模型,该模型最终将变得更易于管理。

您需要以下表格

test_table
    PK: id_test
    testDescription

question_table
    PK: id_question
    FK: id_test
    questionDescription

instance_table *please note that duration and scores will be calculated later on
    PK: id_instance
    FK: id_user
    FK: id_test
    startingTime
    endingTime

question_instance_table
    PK: id_question_instance
    FK: id_instance
    FK: id_question
    questionResult (Boolean)
    (please note here that the PK could be id_instance + id_question ...)

回到您的需求,我们将提供以下服务:

  • 持续时间是通过instance_table的startingDate和EndingDate计算的
  • 分数的计算结果是来自questionResult字段的True值的总和
  • 您可以随时间跟踪和比较一位用户在同一问题上的答案
  • 因此,您可以将已审核的问题定义为针对特定用户具有至少一个错误值的问题
  • 如果您的数据库支持布尔字段的空值,则可以跟踪未回答的问题(questionResult = Null)。否则,建议您使用或构建三个状态字段(允许为Null的整数,例如,加上0和1值),以跟踪未回答的问题(null),错误的答案(0)和正确的答案(1)。
  • 可以通过SQL聚合轻松计算得分为100 *(好的答案数量)/(测试中的问题数量)。
  • 您甚至可以将部分分数计算为好答案的数量/测试中回答的问题的数量。
  • 该模型接受任意数量的测试,每项测试任意数量的问题,任意数量的实例,任意数量的用户…
  • 当然,可以通过向表中添加缺少的属性(例如testNumber,questionNumber字段)来进一步改进它
  • 等等…
2021-04-28