我们需要一些帮助来设计调查问卷和多项选择答案的数据库模式。
第一个选项是设计一个问题表和一个回答表,如下所示
* 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多万用户,每个用户有多份调查问卷。因此,速度绝对是一个标准。根据这个标准,你更喜欢哪一个?还有别的选择吗?
谢谢
发布于 2018-07-11 13:11:48
您在第二种情况中提出的反正规化肯定会带来一些性能提升。最大的问题是,如果你需要高效地搜索数据--比如说,你可能无法收集答案的高级统计数据(即有多少人给出了3到6个答案)。
如果您不需要统计数据,那么第二种方法更好(性能方面)。如果你这样做了,也许你应该坚持使用范式。
折衷的方法是使用JSON而不是列来存储数据。结果可以存储在类似PostgreSQL的jsonb
列中,这样可以很容易地进行查询。你的问题被标记为mysql
,所以我不知道这是不是你的选择。
https://stackoverflow.com/questions/51172273
复制