两种表结构设计的对比

2019-06-13 01:25:01 +08:00
 h2so4

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

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

[ 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

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

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

1657 次点击
所在节点    问与答
6 条回复
h2so4
2019-06-13 01:37:48 +08:00
[ 2 ] 只有一个 问题表 上面选项表的内容作为一个字段存储,把 n 个选项转成 json 存储,然后读取的时候,解析出来

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

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

--------------------------------
更正一下,有一些字打错了
ebingtel
2019-06-13 08:34:03 +08:00
没有其他的背景描述的话,如果基于 mysql,两种方式都 ok ……
h2so4
2019-06-13 08:59:01 +08:00
@ebingtel #2 是基于 mysql 的,用 json 方式存储的话,可能操作起来方便点,毕竟是个横表,主要考虑的是如果后期拓展的话,哪种方式更好呢? [想了想,在选项表中添加字段,和在 json 中添加字段,似乎也没有什么不同?]
littlemoney
2019-06-13 09:16:40 +08:00
如果后期拓展字段很多的话,json 存储的问题需要考虑,varchar 设置的很大、或者用 text,如果是 mysql5.7+倒是可以用 json 试试
kamal
2019-06-13 14:56:14 +08:00
一个思路,供参考:
版本功能只用来展示历史记录,考试和汇总答案时并不会使用到。所以现在设计的基础上只增加一列版本号即可。
历史记录使用新表存储,原来的表只存储最新的版本和版本号。每一行都是有效数据,不保存多余的行。
h2so4
2019-06-17 10:20:58 +08:00
@kamal #5 这个我也考虑过,不过他存在一个要求是,你的编辑修改问题答案不会影响到已经分发出去试卷,有点类似于已经发出去的卷子都是 maven 里面的一个正式版本号,你后面的修改,只要在没有发卷子出去前都是 snapshot 版本,一旦发卷,我就需要把版本固化成 release 的

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

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

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

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

© 2021 V2EX