保护私人版权,尊重他人版权。转载请注明出处并附带页面链接
背景
最近接触到这么一个问题,比如说有一堆商品,运营人员可以根据需要调整商品的先后顺序。
这个问题第一眼看到觉得很简单,立刻就想到了给商品加个order
字段,按照这个字段排序即可。如果是由用户来更改这个order
的值,那确实很简单,但是这样交互很差,所以现在一般都是做成拖拽排序。
下面针对拖拽排序,进行了实现方案设计。
需求
- 允许更改排序
- 新增时更新排序
- 删除时不改变排序
实现方案
方案一:全量更新
每个商品有一个order
值,按照1,2,3...
排序
新增时先拿到最大的order
值加一保存
修改时需要前端把所有被影响到的商品和位置都传给后端,后端还需要对这些数据逐条更新
优点:
- 实现简单
缺点:
- 不适用于大量数据排序的场景,修改排序性能差
方案二:取中值
每个商品有一个order
值,但是这个order
值不按照逐一递增,而是中间有间距,这个间距值可以根据需要来定,假设定为1000,那么就按照1000,2000,3000...
排序
新增时跟方案一类似,拿到最大的order
值加1000保存
修改时的order
值为(上一个商品的order + 下一个商品的 order) / 2
,order
为浮点数
优点:
- 同时保证了新增数据和修改排序时的性能
缺点:
- 考虑到极限场景,如果不停的调整排序,有可能达到数据库关于浮点数的最大精度
总结
第一种方法由于需要全量更新受影响的数据,不推荐使用。当然数据量不大的话,使用起来也不会有什么感觉。
这里推荐用第二种方法,如果用户拖拽不是很频繁,可以直接使用;如果用户拖拽很频繁,可以创建一个定时任务,把所有行的order
值重置。