为每个网站用户(数千个)创建一个包含数千行的SQL表?

时间:2011-10-17 16:02:15

标签: sql

我们正在构建一个电子学习MultipleChoice工具,成千上万的用户将完成我们的测试。我们已经有数千名订阅者参加我们的其他研讨会等,所以很有可能成千上万的人也会完成MC测试。

现在,我们需要跟踪每个用户已回答的每个问题,他花了多长时间,是否正确(经过多少次尝试),如果没有,他给出了哪个错误答案等等。真的很多数据

现在,我们将有数千个问题和数千名用户。由于每个问题至少有4个答案,我们也想跟踪给出的错误答案,我的问题是:在这种特殊情况下,每个用户有一个表是否有意义?

我知道已经在这里询问了每个用户的表格问题(例如here),但我觉得这是一个不同的情况。

那么:一个包含数百万行或数千个包含数千行的表的表?

4 个答案:

答案 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

这种方法可以让你为每个用户选择特定的数据,看看他们进行了多少次测试等,而且管理起来要比成千上万的表容易得多。