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

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

  •  
  •   rizon ·
    othorizon · 2019-02-20 23:26:24 +08:00 · 3731 次点击
    这是一个创建于 2110 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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


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

    11 条回复    2019-02-21 13:32:28 +08:00
    id4alex
        1
    id4alex  
       2019-02-20 23:56:32 +08:00
    必须要追溯数据上拉链表吗?
    xuanbg
        2
    xuanbg  
       2019-02-21 01:56:26 +08:00
    是否属于增量数据,要在前端进行判断才有意义。既然一股脑儿发到后端了,当然是统统删掉然后无脑写入比较简单快捷喽。
    aijam
        3
    aijam  
       2019-02-21 02:07:58 +08:00 via iPhone
    假设前端有足够的信息计算 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
        4
    mrcotter2013  
       2019-02-21 05:59:24 +08:00
    类似的一个应用场景是用户下单,然后修改订单,每次即订单数据的变化。一个解决方案是使用 GraphQL,每次修改的 order 都为一个 node,之前的关系可以设为 updates 进行连接,最初的 node 和最新的 node 之间另有一个 latest 关系。因为基于 GraphQL,每次基本查询的复杂度都是 O(1),后台或者前台进行数据比对也很容易。
    huiyuanai709
        5
    huiyuanai709  
       2019-02-21 07:54:56 +08:00 via Android
    jsonpatch
    TomVista
        6
    TomVista  
       2019-02-21 08:07:12 +08:00
    我前端用的 vue,直接把改动的数据传给后台,后台校验主键然后用(parameter is null or parameter = @parameter) 插进去.
    johnniang
        7
    johnniang  
       2019-02-21 08:12:20 +08:00 via Android
    我的做法:将所有数据都传入后台,后台检验完所有数据合法性后查询出数据,再进行一一对比(当然,肯定是有工具类支持支,不会一个一个去判断),将未改动的设置为 null,最后再 update 数据就好了。
    zhazi
        8
    zhazi  
       2019-02-21 08:14:03 +08:00 via Android
    后台有审计方案 有 event souring 方案 也不用乱七八糟的字段
    sunjourney
        9
    sunjourney  
       2019-02-21 08:17:03 +08:00
    每个 diff 还要处理错误,还要考虑乐观更新
    rizon
        10
    rizon  
    OP
       2019-02-21 11:54:38 +08:00
    @id4alex #1 追溯是要考虑,就算不追溯也考虑到增量修改减少数据的存储量。现在是把一个业务对象拆成了很多小块,每一小块是一个增量的单元,每个单元内任何变化都会去写入一个新的单元对象
    lihongjie0209
        11
    lihongjie0209  
       2019-02-21 13:32:28 +08:00
    什么业务场景下需要增量更新?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2556 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 02:50 · PVG 10:50 · LAX 18:50 · JFK 21:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.