【问题标题】:Make a SQL Table for every User of Website (thousands) with thousands of rows?为网站的每个用户(数千)制作一个包含数千行的 SQL 表?
【发布时间】:2018-05-27 23:20:08
【问题描述】:

我们正在构建一个 eLearning MultipleChoice 工具,成千上万的用户将在其中完成我们的测试。我们的其他研讨会等已经有数千名订阅者,因此很可能会有数千名订阅者完成 MC 测试。

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

现在,我们将有成千上万的问题和成千上万的用户。由于每个问题至少有 4 个答案,而且我们还想跟踪给出的错误答案,所以我的问题是:在这种特殊情况下,每个用户都有一个表格是否有意义?

我知道这里已经问过每个用户的问题(例如here),但我觉得这确实是一个不同的情况。

那么:一张表有几百万行还是几千张表有几千行?

【问题讨论】:

  • 谁标记了这个? OP正在询问选项。如果您因为 OP 一开始就不正确而标记了一个问题,那么这将是一个 Wiki 而不是一个问答论坛。嘘。

标签: sql


【解决方案1】:

每个用户都有一个数据库对象是没有意义的。如果您适当地设计表和数据库结构,则可以轻松管理具有一百万行的表。

每个用户的表将非常难以管理,这不是关系数据库的典型设计方式。

为用户创建一张表并遵守 RDBMS 最佳实践。实施查询调优,并确保表上有适当的索引以及更新的统计信息。

【讨论】:

  • +1 :正确使用规范化、主键和外键、索引等,您永远不需要每个用户的表。这是推论;您是否需要使用 OO 语言为每个用户开设一个新课程?
【解决方案2】:

通常的答案是“每个用户的表”是一个糟糕的设计,简单的解决方案是一个带有额外字段来标识所有权的单个表。

例如有

table_1   table_2    table_3 ...... table_999999999
id        id         id             id
...       ...        ...            ...

是资源的巨大浪费,而拥有

table
id
user
...

更容易表示。

【讨论】:

  • 谢谢,马克。因此,您只需在“一个主表”中添加一个名为“用户”的列,将用户 ID 放入其中,然后将数百万正确和错误回答的问题弹出到一个表中?我仍处于最早的计划阶段(上周开始使用 Latex-Converters),所以我仍然非常灵活!;)谢谢!
  • 你可以有一个包含类似这样字段的表...UserID, TestID, QuestionID, SubmittedAnswerID, TimeSubmitted, ThinkingTime。然后,您的所有用户信息都放在一个表中,您的测试信息在另一个表中,问题列表在另一个表中,可能的答案列表在另一个表中,等等。如果您将所有内容与数据类型分开,您'正朝着正确的方向前进。
  • 嘿,Dems!谢谢!我有这样设置的问题/答案表:一个问题表,一个答案表(每个 questionID 多个)和一个解释为什么错误的答案确实是错误的(由“answerid”连接)。所以现在我只需要那个“用户”表,我很好,在你看来?另外,您会将所有问题都放在一个表格中还是每个主题都有一个表格(每个大约有 30 个测试(每个测试有 30 个问题),总共大约 20 个主题)?谢谢!
【解决方案3】:

许多 RDMS 允许您创建分区表;我认为这将是您的最佳选择(所有用户使用一个分区表;取决于您使用的 RDMS,您将有不同的选项来指定分区键)

【讨论】:

  • 我们计划使用 MySql,所以这应该可以在我们的服务器上使用。我会研究那个选项。很高兴听到每个人的如此明确的反馈。我想我会更好地使用单表解决方案,那么。谢谢!
【解决方案4】:

我绝对不会为每个用户使用一个表,那将成为维护的噩梦。

如果我要尝试设计该数据库,我可能会尝试尽可能多地分解数据,例如,您有:

Users 表:包含您的所有用户 问题:包含所有问题

results:包含所有结果 用户ID、test_id、时间

测试 testID、questionid、answers、time_to_complete

答案 answer_id,回答

所以在这种情况下,您的结果表是一个概览,它包含用户 ID、他们进行的测试以及完成它的时间,这是整个事情的概览。 接下来你有测试表,这是用户逐个问题进行的整个测试,所以你有问题的 id,一个指向用户提交的每个答案的表的链接,然后是完成它的时间。 Answers 表包含用户提交的每个答案

所以数据看起来像:

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

这种方法可以让您为每个用户选择特定的数据,查看他们参加了多少次测试等,并且比管理数千个表格要容易得多。

【讨论】:

  • 嘿紫金鱼!感谢您提供详细的答案。这听起来也是一个不错的方法。只有一个问题:在“测试”表中,我还会添加用户 ID,对吗?不是在这里挑剔,但我不太明白你是否会为每个用户进行的每个测试创建一个新的测试表(所以如果我参加测试 1,将创建一个表,如果我再次参加一个新表将被创建等),或者如果您将所有测试的所有用户的所有结果添加到该表中。你能澄清一下吗?谢谢!
  • 测试表可能不是最好的命名方式,但想法是您在结果表中有用户 ID,然后测试表链接到 TestID 上的结果表,因此您不需要用户 ID那里。您可能可以为表格找出一些更合适的名称,但想法是结果链接到测试,测试链接到答案。我不确定您是否有预定义的测试或只是随机问题,但我想我会称之为测试只是为了显示用户在一个会话中提出的所有问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-22
相关资源
最近更新 更多