如何高效的存储手工排序 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
workwonder
V2EX    数据库

如何高效的存储手工排序

  •  
  •   workwonder 2017-10-23 18:33:57 +08:00 via Android 2006 次点击
    这是一个创建于 2927 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如有两个实体,Project 和 Task,一个 project 对应多个 tasks。
    现在要求能够通过 UI 拖动实现单个 project 下的 tasks 自定义排序。
    我看通用的做法是在 task 上加排序字段,但这样的话每次拖动都可能导致所有相关的 tasks 重写,拖来拖去容易导致写风暴。

    请教下有没有更有效的实现方案?
    12 条回复    2017-10-23 20:09:23 +08:00
    noNOno
        1
    noNOno  
       2017-10-23 18:59:17 +08:00
    允许延迟写么,先把排序放临时表,然后延迟更新到控制表中.这样可以控制一定时间内频繁拖动只有最后一次写入
    workwonder
        2
    workwonder  
    OP
       2017-10-23 19:07:30 +08:00
    @noNOno 你这种方案需要额外引入异步调度任务
    x8
        3
    x8  
       2017-10-23 19:08:31 +08:00
    写风暴是啥?
    你拖动的时候不是在内存读写吗
    workwonder
        4
    workwonder  
    OP
       2017-10-23 19:12:00 +08:00
    @lizon 我的意思是拖动实时生效,一次拖动,需要改 N 个 task 的 position 字段。同时一个 project 是多人管理的,如果有好几个人拖来拖去,那写操作就比较夸张了。
    noNOno
        5
    noNOno  
       2017-10-23 19:12:01 +08:00
    @workwonder 是的,只能想到这个.频繁写的情况考虑用列式存储库(redis)么.
    workwonder
        6
    workwonder  
    OP
       2017-10-23 19:18:50 +08:00
    @noNOno 暂时往简单的方向做,尽量兼顾性能。

    我还有个方案是在 Project 上添加一个数组字段( Project.tasks_order, e.g. ['t001', 't002', 't003']),用来保存 tasks 的顺序,这样每次拖动都只用改单个 project 的 tasks_order 属性。这种方法在存储上比较冗余( Task 上面已经有了到 Project 的外键),同时如果想按 tasks_order 的顺序读取出来,还无法利用数据库做到,需要额外在程序中排序。总之感觉这种方案怪怪的。
    ZnZt
        7
    ZnZt  
       2017-10-23 19:31:21 +08:00   1
    workwonder
        8
    workwonder  
    OP
       2017-10-23 19:43:34 +08:00
    @ZnZt 多谢老搭档,其实我的业务实体不是 Project+Task,看来这两个关键词好搜索。
    workwonder
        9
    workwonder  
    OP
       2017-10-23 19:58:03 +08:00
    @ZnZt 拖动到目标位置后把 position 设置为前后之和取平均的方法确实也考虑了并实施了,但正如大家都提到的,很快就会消耗完所有能够表达的数字(哪怕支持小数),而且我当时把没有搞那么的的步长,很快就觉得这种机制不靠谱。

    文中提到可以在闲时再重拍,避免数字被消耗光,我觉得靠谱。准备再考虑下这种方案。
    ZnZt
        10
    ZnZt  
       2017-10-23 20:00:55 +08:00
    @workwonder 嗯, 真实场景校验过的方案, 应该没啥问题
    ZnZt
        11
    ZnZt  
       2017-10-23 20:03:58 +08:00
    @workwonder 现在写前端,写 Python/Django, 感觉是在走你老路啊。不知道还能走多久 =。=
    workwonder
        12
    workwonder  
    OP
       2017-10-23 20:09:23 +08:00
    @ZnZt 我现在写 Flask+ArangoDB
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5721 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 01:47 PVG 09:47 LAX 18:47 JFK 21:47
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86