V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
h2so4
V2EX  ›  问与答

两种表结构设计的对比

  •  2
     
  •   h2so4 · 2019-06-13 01:25:01 +08:00 · 1660 次点击
    这是一个创建于 2025 天前的主题,其中的信息可能已经有所发展或是发生改变。

    情景:答卷系统的问题库需要支持查看单个问题的编辑历史,所以我想到添加版本号的方式存储

    在表结构设计的时候,想过两种方式

    [ 1 ] 一个 问题表 + 选项表,问题表和选项表通过一个 groupId + versionId 关联 类似这样的:

    问题表:

    groupId,versionId,questionName,status,type.....

    选项表: groupId,versionId,optionValue,sort.....

    这样的话,问题编辑后,原有记录不变,在问题表和选项表中再插入一份 1 对多的数据,保持他们的 groupId 一致,versionId 增加 1

    [ 2 ] 只有一个 问题表 上面选项表的内容作为一个字段存储,把 n 个选项转成 json 存储,然后读取的时候,解析出来问题表 groupId,versionId,questionName,status,type,optionJsonValue .....

    这样的话,问题编辑后,原有记录不变,在问题表和选项表中再插入一条数据即可,依旧保持 groupId 一致, versionId 增加 1

    这两种方式那种比较好呢?

    还有没有比较合适的方式?请教各位大佬

    6 条回复    2019-06-17 10:20:58 +08:00
    h2so4
        1
    h2so4  
    OP
       2019-06-13 01:37:48 +08:00 via Android
    [ 2 ] 只有一个 问题表 上面选项表的内容作为一个字段存储,把 n 个选项转成 json 存储,然后读取的时候,解析出来

    问题表:
    groupId,versionId,questionName,status,type,optionJsonValue .....

    这样的话,问题编辑后,原有记录不变,只要在问题表中再插入一条数据即可,依旧保持 groupId 一致,versionId 增加 1

    --------------------------------
    更正一下,有一些字打错了
    ebingtel
        2
    ebingtel  
       2019-06-13 08:34:03 +08:00
    没有其他的背景描述的话,如果基于 mysql,两种方式都 ok ……
    h2so4
        3
    h2so4  
    OP
       2019-06-13 08:59:01 +08:00
    @ebingtel #2 是基于 mysql 的,用 json 方式存储的话,可能操作起来方便点,毕竟是个横表,主要考虑的是如果后期拓展的话,哪种方式更好呢? [想了想,在选项表中添加字段,和在 json 中添加字段,似乎也没有什么不同?]
    littlemoney
        4
    littlemoney  
       2019-06-13 09:16:40 +08:00
    如果后期拓展字段很多的话,json 存储的问题需要考虑,varchar 设置的很大、或者用 text,如果是 mysql5.7+倒是可以用 json 试试
    kamal
        5
    kamal  
       2019-06-13 14:56:14 +08:00
    一个思路,供参考:
    版本功能只用来展示历史记录,考试和汇总答案时并不会使用到。所以现在设计的基础上只增加一列版本号即可。
    历史记录使用新表存储,原来的表只存储最新的版本和版本号。每一行都是有效数据,不保存多余的行。
    h2so4
        6
    h2so4  
    OP
       2019-06-17 10:20:58 +08:00
    @kamal #5 这个我也考虑过,不过他存在一个要求是,你的编辑修改问题答案不会影响到已经分发出去试卷,有点类似于已经发出去的卷子都是 maven 里面的一个正式版本号,你后面的修改,只要在没有发卷子出去前都是 snapshot 版本,一旦发卷,我就需要把版本固化成 release 的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2803 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 03:36 · PVG 11:36 · LAX 19:36 · JFK 22:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.