设计模式-讨论:如何优雅的增量保存前端传给后台的数据

2019-02-20 23:26:24 +08:00
 rizon

这大概是一个很常见的设计,但是之前从没做过这种的。求助大佬们有什么优雅的方案。

场景
前端每次修改完表单后总会把表单中所有的数据传给后端服务,后端服务实现只保存增量的变化数据。
增量是指:新增的数据,修改的数据,删除的数据

问题
怎么设计这个东西,逻辑方面和数据存储方面


我现在的设计
1.存储方面采用了拉链表
2.要采用增量,而又不依赖前端去判断变化,那么就必须后台对比数据确认哪些修改过,下面是我的优化方案,
返回数据给前端时会在对象中放入一个 tag,这个 tag 是把对象中的属性计算了 hash,前端修改完数据传给后台时会把 tag 返回给后台,后台重新计算对象的 tag 和原 tag 对比确认哪些数据修改过了,然后增量保存到拉链表。

3748 次点击
所在节点    程序员
11 条回复
id4alex
2019-02-20 23:56:32 +08:00
必须要追溯数据上拉链表吗?
xuanbg
2019-02-21 01:56:26 +08:00
是否属于增量数据,要在前端进行判断才有意义。既然一股脑儿发到后端了,当然是统统删掉然后无脑写入比较简单快捷喽。
aijam
2019-02-21 02:07:58 +08:00
假设前端有足够的信息计算 diff,通常 diff 是昂贵操作,感觉还是前端做好点,后端只做验证。前端只需要发送三种操作的 diff script,后端按照执行就行。那需要解决的问题就成了给定前( old )后( new )两个版本的数据,前端如何计算 diff 的问题。如果表单只是简易的 key value pair,key in old not in new 是删除,key in new not in old 是新增,key in both and value changed 是修改,基本是 O ( m+n )操作。不一定满足 lz 场景,提供一个思路。
mrcotter2013
2019-02-21 05:59:24 +08:00
类似的一个应用场景是用户下单,然后修改订单,每次即订单数据的变化。一个解决方案是使用 GraphQL,每次修改的 order 都为一个 node,之前的关系可以设为 updates 进行连接,最初的 node 和最新的 node 之间另有一个 latest 关系。因为基于 GraphQL,每次基本查询的复杂度都是 O(1),后台或者前台进行数据比对也很容易。
huiyuanai709
2019-02-21 07:54:56 +08:00
jsonpatch
TomVista
2019-02-21 08:07:12 +08:00
我前端用的 vue,直接把改动的数据传给后台,后台校验主键然后用(parameter is null or parameter = @parameter) 插进去.
johnniang
2019-02-21 08:12:20 +08:00
我的做法:将所有数据都传入后台,后台检验完所有数据合法性后查询出数据,再进行一一对比(当然,肯定是有工具类支持支,不会一个一个去判断),将未改动的设置为 null,最后再 update 数据就好了。
zhazi
2019-02-21 08:14:03 +08:00
后台有审计方案 有 event souring 方案 也不用乱七八糟的字段
sunjourney
2019-02-21 08:17:03 +08:00
每个 diff 还要处理错误,还要考虑乐观更新
rizon
2019-02-21 11:54:38 +08:00
@id4alex #1 追溯是要考虑,就算不追溯也考虑到增量修改减少数据的存储量。现在是把一个业务对象拆成了很多小块,每一小块是一个增量的单元,每个单元内任何变化都会去写入一个新的单元对象
lihongjie0209
2019-02-21 13:32:28 +08:00
什么业务场景下需要增量更新?

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

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

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

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

© 2021 V2EX