现在项目中有个地方需要做问卷, 有下面 3 个表, question 存放问题, choice 存放选项, answer 存放用户的答案。
question
id | name |
choice
id | question_id | name |
answer
id | user_id | question_id | choice_id |
题目和选项都是在后台录入的, 添加问题的时候, 下面有个 "添加选项
" 的按钮, 点一下表单里面多出一个 input 输入选项名称这样的交互, 存的时候把前端提交过来的数据里面的选项数据存到choice
表里面。
现在遇到 2 个问题
编辑问题的时候, 给选项改个名称、调整个顺序或是添加 /删除一个选项, 不好和选项表中已存在的数据对应起来啊, 我想在选项表中加一个 is_active
的字段, 每次编辑的时候都相当于重新生成了一批, 把以前问题下面对应的选项的 is_active
全部置为 false
, 新添加的这一批就为 true
。
如果用户填过了问卷, 之后里面的某个题目又在后台编辑过了, 那用户点进来查看记录的时候, 应该显示他当时看到的那一批选项和选中的吧, 这个好像又得改 answer
表了。
麻烦大佬们给我这个菜鸡指条明路吧😭, 数据库是 mysql, 表这里应该怎么改, 还有前端添加 /编辑问题的交互应该怎么样做最方便合理, 谢谢各位大佬了。
1
zacharyjia 2020-02-15 11:15:38 +08:00 1
我感觉这其实是个业务问题吧,应该由 PM 考虑这种情况的处理方式,然后技术再根据产品设计做数据库设计吧。
|
2
noobma OP @zacharyjia 不是公司的项目, 所以也没有 PM 啥的😂 就我自己做前后端, 常见的交互还能对付对付, 这种不常见的就搞不定了, 得来请教 v 友大佬了🙏
|
3
zangai 2020-02-15 11:34:28 +08:00 1
问卷和选项放一张表,可以用 json 存,修改 就 copy on write, 记录版本号是否发布等,回复作为单独一张表
|
4
noobma OP @zangai 用 json 文本存 choice 选项的的话,在 answer 表里面不好关联 choice 选项吧
|
5
Oceanhime 2020-02-15 12:05:57 +08:00 1
同意 #3, 选项用 JSON 存问卷表里面, 解决修改选项问题。如果要修改之后用户还能看到以前的内容, 就把每个问卷单独设置一个版本号, 基于版本号去查问卷信息。
前端添加和编辑问题的交互, 没看到整体设计可能也帮不了你。不过大多数问卷系统都采用的是卡片式的, 单个问题一个卡片, 添加就 append 卡片, 编辑问题就点击相关项编辑文本。 |
6
Oceanhime 2020-02-15 12:08:16 +08:00 1
@noobma 选择的话每个 option 都设置一个 id, answer 里面就存这个 option 的 id 就可以。
|
7
imn1 2020-02-15 12:12:55 +08:00 1
过来人给你的建议:
1.单一问题为一条记录 2.单一问题的答案为一条记录 或者能做到单独提取一条问题和一条答案也可放在一起,例如 json 另外 1.一个问卷可能多条问题 2.问题题型会有不同,尤其需要分清单选多选,多选时要能单独提取某个选项 3.提问人不一定是一个,也不一定是自然人,答卷也是 4.开放性问题比较难处理,最好有预案 5.不要忘了时间地点,很重要的 6.也不要少了一个选择肢序号相关的字段,方便调整和提取,统计时用序号提取要方便很多 …… 如果还要做问卷设计的 GUI,那就更复杂了,10+年前我用 php 不是做了几页,而是整整做了一个系统 问卷设计是个学问,以前有问卷设计师这个职业,现在不知道有没有 总的来说,不要想得太简单,不然调查完了以后,上头才来布置个统计分析的任务,就傻眼了 |
8
imn1 2020-02-15 12:18:06 +08:00 1
修正#7
2.单一个人、单一个问题的答案为一条记录(一份答卷多条记录) 因为分析时,大部分都是同一个问题跨不同答卷的,细化到问题甚至某个选项才是需求,整个答卷为一条记录的话,写统计分析的程序就要复杂很多了 |
9
noclin 2020-02-15 13:38:36 +08:00 1
关联选项用 id,不要用文本,**改个名称、调整个顺序或是添加 /删除一个选项**不会改变 id。
|
12
noobma OP @noclin > **改个名称、调整个顺序或是添加 /删除一个选项**不会改变 id。
我没有把情况说清楚,现在做添加 /删除 /排序 /改名称这些操作的时候只是在前端把数据变了,最后点提交按钮的时候才会提交 choice []过来,那后端就得解析这个数组,逐个和数据库里面的比较差异,再更新到数据库里面,好像太麻烦了😂 |
13
Citrullus 2020-02-15 15:35:03 +08:00 1
这个排版真舒服
|
14
qiayue 2020-02-15 16:01:53 +08:00 1
你转换一下思路问题就好办了,你不需要等到全部编辑完成再提交然后后端解析保存,而是编辑一题就自动保存一题。
另外,排序问题,你每个题目加一个序号,前端重新排序,其实是修改序号,不影响 id。 |
16
hallDrawnel 2020-02-15 19:35:15 +08:00 1
感觉不要用关系数据库更科学一点?
|
17
noclin 2020-02-16 13:13:47 +08:00 1
@noobma 你提交的时候附加一个 ID 就好了。例如,每个 choice 由 `"choice1"` 变成 `{text:"choice1",id:uuid}`,但是要注意后端验证。
|
18
zangai 2020-02-16 15:49:44 +08:00 1
|