V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
noobma
V2EX  ›  程序员

问卷表设计问题

  •  
  •   noobma · 2020-02-15 11:04:40 +08:00 · 2769 次点击
    这是一个创建于 1531 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在项目中有个地方需要做问卷, 有下面 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, 表这里应该怎么改, 还有前端添加 /编辑问题的交互应该怎么样做最方便合理, 谢谢各位大佬了。

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

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

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

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

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

    @qiayue 谢谢大佬,我看看前端怎么改方便处理
    hallDrawnel
        16
    hallDrawnel  
       2020-02-15 19:35:15 +08:00   ❤️ 1
    感觉不要用关系数据库更科学一点?
    noclin
        17
    noclin  
       2020-02-16 13:13:47 +08:00   ❤️ 1
    @noobma 你提交的时候附加一个 ID 就好了。例如,每个 choice 由 `"choice1"` 变成 `{text:"choice1",id:uuid}`,但是要注意后端验证。
    zangai
        18
    zangai  
       2020-02-16 15:49:44 +08:00   ❤️ 1
    @noobma
    https://article.fanqier.cn/features/open-api-help
    业务不是很重的话,简单点,直接用三方的表单系统,然后自己解析推送数据
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5356 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 08:51 · PVG 16:51 · LAX 01:51 · JFK 04:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.