前言
有管理后臺的地方,就肯定會有排序功能,有排序功能肯定就會要求良好的用戶體驗:置頂、置尾、交換、拖動。如何針對大數據量設計出簡單、高效的排序方案呢?且聽我細細道來...
操作說明
置頂:將該數據放到全局數據的首位,其余數據保持順序不變。
image.png
置尾:將該數據放到全局數據的末尾,其余數據保持順序不變。
image.png
-
交換:將兩個數據互換位置,其余數據順序保持不變。
image.png
拖動:將該數據拖動放到合適的位置,局部數據順序發生變化。如圖所示,需要將數據4拖動到數據1的后面,同時被拖動路徑覆蓋的數據2、3需要將順序往后順延。
image.png
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 發生改變。