请教一个老问题,关于批量发布的问题

题目描述

上述问题,避不开的就是数据存在两份,比如说一份后台正在编辑的文章,一份用户正在浏览的文章。怎么能够实现数据的修改量,数据占用的空间量最小。如果单独看文章,比如文章表这一张表,问题也比较好处理,对数据做备份。比如当需要编辑文章时,给文章建立一个备份数据,后台修改的都是备份数据,这样不影响前台用户浏览,后台修改好了后,点击发布,备份数据覆盖原始数据,同时删除备份数据,有点Linux里bak文件的味道。增删改皆如此。当然这个思路也可以反过来用,创捷备份数据,后台直接修改原始数据,用户浏览备份数据。这样用户浏览的逻辑就需特殊处理一下。这里单表,此种思路即可解决。但是如果是多表数据,比如文章有类别,娱乐文章,新闻文章等,当对文章类别编辑时,数据联动如何处理。再多一点文章有一到多个标签,比如是如片文章,花边文章。三表联动,都需要维护变更状态。这种情况下,像刚刚那边加备份数据的方式就会及其复杂。不知道坛子里的大神们有什么好的思路。

题目来源及自己的思路

楼主这里,之前做过一个两表联动的数据,有两个角色有点类似文章和标签。一篇文章有一到多个标签。楼主设计了三张表,文章表,标签表。文章<->标签关系表,联动的是标签和文章<->标签关系表,当对标签做增删改时,同时联动关系表,后台修改完毕统一发布。
楼主对标签和关系表都做了备份处理,当标签修改时,增加标签备份数据,同时联动,关系表中反正该标签数据,皆增加备份。删除时,同修改。新增最简单,只需要增加标签备份,关系表中无数据处理。中间涉及对原始数据的增删改,对备份数据的删改。做了很大的工作量,深深感到被自己设计的方案坑到了。

也还有其他思路。
比如楼主思考过的,就是设计表的时候设计双字段,就好比一个事物由正反两方面,正的一边是给别人看的,反的一面是自己看的。这样的话在数据表里只有一条数据,一个id。维护起来很容易,缺陷是字段冗余。
还有就是极其暴力的做法,两张类似的表,和上面的方法的思想有点类似,同样冗余。

阅读 2k
2 个回答

经过实践,推荐创建两张相同的表吧,一张表里有标记状态字段,同一在表与表直接同步变更吧。上面的两种方法,在多张表数据关联时,业务处理麻烦的很,很容易有bug。

题主的这种问题应该就是读者写者问题了,常用办法就是加互斥锁,读写锁,数据版本等等。题主上面分析的应该属于写时复制技术,比如 Java中的CopyOnWriteList,就是在更新数据过程中复制一分数据进行更新,更新完成后再回写回去,写回这个操作确实麻烦,题主可以换一种方式,比如:

A表:主要字段文章的Id以及文章所在的表
B表:文章表1
C表:文章表2
A表和B表相同,比如说在更新一篇已发布的文章时(假设在B表,此时A表记录的是[1,'B']),直接复制一份到C表进行更新,一段时间后更新完成发布了不用写回B表,直接将A表的记录改成[1,'C'],这样就避免了写回时的各种麻烦。
CopyOnWriteList也是这么处理的

方法二:加读写锁,读写互斥
文章在发布后需要更改时,先要对文章取消发布,这样在更新过程中的文章就是读不到的,达到了互斥的目的。但是这种方法用户体验不好。

方法三:数据版本
题主可以研究下数据库的MVCC,比如MySQL的隔离级别就是用MVCC实现的,他能保证每个事物的内部更新不影响到其他事务,同理,你这里可以使用同样的办法来保证数据在更新是不影响其他用户的读取。这种方法逻辑相对简单,只需要加三个字段就OK了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题