前言
有管理后台的地方,就肯定会有排序功能,有排序功能肯定就会要求良好的用户体验:置顶、置尾、交换、拖动。如何针对大数据量设计出简单、高效的排序方案呢?且听我细细道来...
操作说明
置顶:将该数据放到全局数据的首位,其余数据保持顺序不变。
置尾:将该数据放到全局数据的末尾,其余数据保持顺序不变。
-
交换:将两个数据互换位置,其余数据顺序保持不变。
拖动:将该数据拖动放到合适的位置,局部数据顺序发生变化。如图所示,需要将数据4拖动到数据1的后面,同时被拖动路径覆盖的数据2、3需要将顺序往后顺延。
DB设计
DB表须设计一个有符号排序字段,如:order_num。排序按照从小到大方式。
实现策略
- 置顶操作:将需要置顶的数据的 order_num 设置为全局Min(order_num) - 1
- 置尾操作:将需要置尾的数据的 order_num 设置为全局Max(order_num) + 1
- 交换操作:将需要交换的数据的 order_num 值互换即可。
- 拖动操作:将4插入到1的后面,将顺序变动的数据4、2、3的 order_num 取出,然后对 order_num 进行从小到大排序,依次赋值给4、3、2。
结束语
将 order_num 设计为有符号类型,会存在负值。但能很好的保证最小变动原则,高效的完成排序操作。新增记录操作,可以默认是置尾/置顶操作。理论上 order_num 是不会重复的,但可能不连续(因为有删除操作)。管理后台都会对数据进行分页,拖动一般也就是在本页内完成操作,如果嫌实现麻烦,完全可以将本页的全部ID(排完序)都提交,反正也就一页数据的 order_num 发生改变。