我们需要一些帮助来设计调查问卷和多项选择答案的数据库模式。
第一个选项是设计问题表和答案表,如下所示
* Question Table
- question_id auto integer
- question varchar
* Answer Table
- user_id integer
- question_id integer
- answer integer
然而,这种设计的问题是,当用户提交问卷答案时,需要插入多行,因此写和检索都会比较慢。而且,table会变得很大。但是,它的优点是可以扩展,并且可以很容易地添加新问题。
另一种方法是将所有答案放在一行不同的列中,如下所示
* Answer Table
- user_id integer
- answer_1 integer
- answer_2 integer
...
- answer_n integer
优点是,一次只能写入或检索一行,因此比第一种方法快得多。然而,schema将是严格的,如果添加了任何新的问题,db schema将不得不更改以容纳新的列。
我们有超过300万用户,每个用户有多份调查问卷。因此速度绝对是一个标准。根据这个标准,你更喜欢哪一个?还有别的选择吗?
谢谢
1条答案
按热度按时间dl5txlt91#
您在第二种情况中提出的预期的非规范化肯定会产生一些性能增益。最大的问题是,如果你需要能够有效地搜索数据——比如说,你可能无法收集关于答案的高级统计数据(即有多少人给出了3到6个答案)。
如果您不需要统计信息,那么第二个选项更好(性能方面)。如果你这样做了,也许你应该坚持正常形式。
一种折衷方法是使用json而不是列来存储数据。结果可能存储在类似postgresql的文件中
jsonb
列,便于查询。您的问题已标记mysql
不过,我不知道你是否有选择。