问卷表设计问题

2020-02-15 11:04:40 +08:00
 noobma

现在项目中有个地方需要做问卷, 有下面 3 个表, question 存放问题, choice 存放选项, answer 存放用户的答案。

question

idname

choice

idquestion_idname

answer

iduser_idquestion_idchoice_id

题目和选项都是在后台录入的, 添加问题的时候, 下面有个 "添加选项" 的按钮, 点一下表单里面多出一个 input 输入选项名称这样的交互, 存的时候把前端提交过来的数据里面的选项数据存到choice表里面。

现在遇到 2 个问题

  1. 编辑问题的时候, 给选项改个名称、调整个顺序或是添加 /删除一个选项, 不好和选项表中已存在的数据对应起来啊, 我想在选项表中加一个 is_active 的字段, 每次编辑的时候都相当于重新生成了一批, 把以前问题下面对应的选项的 is_active 全部置为 false, 新添加的这一批就为 true

  2. 如果用户填过了问卷, 之后里面的某个题目又在后台编辑过了, 那用户点进来查看记录的时候, 应该显示他当时看到的那一批选项和选中的吧, 这个好像又得改 answer 表了。

麻烦大佬们给我这个菜鸡指条明路吧😭, 数据库是 mysql, 表这里应该怎么改, 还有前端添加 /编辑问题的交互应该怎么样做最方便合理, 谢谢各位大佬了。

2893 次点击
所在节点    程序员
18 条回复
zacharyjia
2020-02-15 11:15:38 +08:00
我感觉这其实是个业务问题吧,应该由 PM 考虑这种情况的处理方式,然后技术再根据产品设计做数据库设计吧。
noobma
2020-02-15 11:24:32 +08:00
@zacharyjia 不是公司的项目, 所以也没有 PM 啥的😂 就我自己做前后端, 常见的交互还能对付对付, 这种不常见的就搞不定了, 得来请教 v 友大佬了🙏
zangai
2020-02-15 11:34:28 +08:00
问卷和选项放一张表,可以用 json 存,修改 就 copy on write, 记录版本号是否发布等,回复作为单独一张表
noobma
2020-02-15 12:02:47 +08:00
@zangai 用 json 文本存 choice 选项的的话,在 answer 表里面不好关联 choice 选项吧
Oceanhime
2020-02-15 12:05:57 +08:00
同意 #3, 选项用 JSON 存问卷表里面, 解决修改选项问题。如果要修改之后用户还能看到以前的内容, 就把每个问卷单独设置一个版本号, 基于版本号去查问卷信息。
前端添加和编辑问题的交互, 没看到整体设计可能也帮不了你。不过大多数问卷系统都采用的是卡片式的, 单个问题一个卡片, 添加就 append 卡片, 编辑问题就点击相关项编辑文本。
Oceanhime
2020-02-15 12:08:16 +08:00
@noobma 选择的话每个 option 都设置一个 id, answer 里面就存这个 option 的 id 就可以。
imn1
2020-02-15 12:12:55 +08:00
过来人给你的建议:
1.单一问题为一条记录
2.单一问题的答案为一条记录
或者能做到单独提取一条问题和一条答案也可放在一起,例如 json

另外
1.一个问卷可能多条问题
2.问题题型会有不同,尤其需要分清单选多选,多选时要能单独提取某个选项
3.提问人不一定是一个,也不一定是自然人,答卷也是
4.开放性问题比较难处理,最好有预案
5.不要忘了时间地点,很重要的
6.也不要少了一个选择肢序号相关的字段,方便调整和提取,统计时用序号提取要方便很多
……

如果还要做问卷设计的 GUI,那就更复杂了,10+年前我用 php 不是做了几页,而是整整做了一个系统
问卷设计是个学问,以前有问卷设计师这个职业,现在不知道有没有

总的来说,不要想得太简单,不然调查完了以后,上头才来布置个统计分析的任务,就傻眼了
imn1
2020-02-15 12:18:06 +08:00
修正#7
2.单一个人、单一个问题的答案为一条记录(一份答卷多条记录)

因为分析时,大部分都是同一个问题跨不同答卷的,细化到问题甚至某个选项才是需求,整个答卷为一条记录的话,写统计分析的程序就要复杂很多了
noclin
2020-02-15 13:38:36 +08:00
关联选项用 id,不要用文本,**改个名称、调整个顺序或是添加 /删除一个选项**不会改变 id。
noobma
2020-02-15 14:41:48 +08:00
@Oceanhime 谢谢大佬,很清晰了
noobma
2020-02-15 14:44:25 +08:00
@imn1 谢谢大佬的提醒😊,很周到
noobma
2020-02-15 14:50:18 +08:00
@noclin > **改个名称、调整个顺序或是添加 /删除一个选项**不会改变 id。
我没有把情况说清楚,现在做添加 /删除 /排序 /改名称这些操作的时候只是在前端把数据变了,最后点提交按钮的时候才会提交 choice []过来,那后端就得解析这个数组,逐个和数据库里面的比较差异,再更新到数据库里面,好像太麻烦了😂
Citrullus
2020-02-15 15:35:03 +08:00
这个排版真舒服
qiayue
2020-02-15 16:01:53 +08:00
你转换一下思路问题就好办了,你不需要等到全部编辑完成再提交然后后端解析保存,而是编辑一题就自动保存一题。
另外,排序问题,你每个题目加一个序号,前端重新排序,其实是修改序号,不影响 id。
noobma
2020-02-15 18:45:56 +08:00
@Citrullus 那大佬不发表下高见吗😂

@qiayue 谢谢大佬,我看看前端怎么改方便处理
hallDrawnel
2020-02-15 19:35:15 +08:00
感觉不要用关系数据库更科学一点?
noclin
2020-02-16 13:13:47 +08:00
@noobma 你提交的时候附加一个 ID 就好了。例如,每个 choice 由 `"choice1"` 变成 `{text:"choice1",id:uuid}`,但是要注意后端验证。
zangai
2020-02-16 15:49:44 +08:00
@noobma
https://article.fanqier.cn/features/open-api-help
业务不是很重的话,简单点,直接用三方的表单系统,然后自己解析推送数据

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/644724

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX