【问题标题】:database schema for storing questionnaires and multiple choice answers用于存储问卷和多项选择答案的数据库模式
【发布时间】:2018-12-12 19:30:00
【问题描述】:

在设计问卷和多项选择答案的数据库架构时,我们需要一些帮助。

第一个选项是设计一个问题表和一个答案表,如下所示

 * Question Table
   - question_id    auto integer
   - question       varchar

 * Answer Table
   - user_id        integer
   - question_id    integer
   - answer         integer 

但是,这种设计的问题在于,当用户提交问卷答案时,需要插入多行,因此写入和检索都会变慢。此外,表会变得非常大。但是,优点是它具有可扩展性,并且可以轻松添加新问题。

另一种方法是将所有答案放在一行但在不同的列中,像这样

 * Answer Table
   - user_id        integer
   - answer_1       integer 
   - answer_2       integer 
   ...
   - answer_n       integer 

优点是,一次只能写入或检索一行,因此它会比第一种方法快得多。但是,架构将是僵化的,如果添加任何新问题,则必须更改数据库架构以容纳新列。

我们有超过 300 万用户,每个用户有多个问卷。因此,速度绝对是一个标准。根据这个标准,你更喜欢哪一个?还有其他选择吗?

谢谢

【问题讨论】:

  • 您添加新问题的频率如何?另外,您的 Answer 表中是否包含问卷调查 ID 字段?

标签: mysql database-design schema database-schema


【解决方案1】:

您在第二种情况下提出的预期非规范化肯定会产生一些性能提升。最大的问题是您是否需要能够有效地搜索数据 - 比如说,您可能无法收集有关答案的高级统计信息(即有多少人给出了 3 到 6 个答案)。

如果您不需要统计信息,则第二种选择更好(性能方面)。如果你这样做,也许你应该坚持正常的形式。

一种折衷方案是使用 JSON 而不是列来存储数据。结果可能存储在 PostgreSQL 的jsonb 列中,可以轻松查询。不过,您的问题已标记为 mysql,所以我不知道这是否适合您。

【讨论】:

  • 从 MySQL 5.7.8(大约 2015-16 年)开始,MySQL 支持原生 JSON 数据类型。我自己没用过。但我同意 Postgres 的 jsonb 数据类型可能是最简单的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-15
  • 2021-05-05
相关资源
最近更新 更多