我们正在构建一个电子学习MultipleChoice工具,成千上万的用户将完成我们的测试。我们已经有数千名订阅者参加我们的其他研讨会等,所以很有可能成千上万的人也会完成MC测试。
现在,我们需要跟踪每个用户已回答的每个问题,他花了多长时间,是否正确(经过多少次尝试),如果没有,他给出了哪个错误答案等等。真的很多数据
现在,我们将有数千个问题和数千名用户。由于每个问题至少有4个答案,我们也想跟踪给出的错误答案,我的问题是:在这种特殊情况下,每个用户有一个表是否有意义?
我知道已经在这里询问了每个用户的表格问题(例如here),但我觉得这是一个不同的情况。
那么:一个包含数百万行或数千个包含数千行的表的表?
答案 0 :(得分:10)
每个用户拥有一个数据库对象永远不会有意义。如果适当地设计表和数据库结构,则可以轻松管理具有一百万行的表。
每个用户的表将非常难以管理,而这通常不是关系数据库的设计方式。
为用户创建一个表并遵循RDBMS最佳实践。实现查询调优,并确保表上有适当的索引以及更新的统计信息。
答案 1 :(得分:4)
通常的答案是“每个用户的表”是一个糟糕的设计,简单的解决方案是一个单独的表,其中有一个额外的字段来识别所有权。
e.g。具有
table_1 table_2 table_3 ...... table_999999999
id id id id
... ... ... ...
是一种巨大的资源浪费,而
table
id
user
...
更容易表达。
答案 2 :(得分:1)
许多RDMS允许您创建分区表;我认为这将是您的最佳选择(所有用户都有一个分区表;取决于您使用的RDMS,您将有不同的选项来指定分区键)
答案 3 :(得分:0)
我肯定不会为每个用户使用一个表,这只会成为维护的噩梦。
如果我尝试设计该数据库,我可能会尝试尽可能地分解数据,例如你有:
用户表:包含您的所有用户 问题:包含所有问题
结果:包含所有结果 UserID,test_id,time
测试 testID,questionid,answers,time_to_complete
答案 answer_id,回答
因此,在这种情况下,您的结果表是概述,它包含用户ID,他们进行的测试以及完成它的时间,这是对整个事物的概述。 接下来你有测试表,这是用户逐个问题的整个测试,所以你有问题的id,一个表的链接,用户提交的每个答案,然后是完成它的时间。 答案表有用户提交的每个答案
所以数据看起来像:
Results
UserID, TestID, Time
1 1 00:11
Test
TestID QuestionID, answers, time_to_complete
1 1 1 00:10:00
1 2 2 00:01:00
Answers
answer_id, Answers
1 A
1 B
2 A
3 A
3 B
3 C
这种方法可以让你为每个用户选择特定的数据,看看他们进行了多少次测试等,而且管理起来要比成千上万的表容易得多。