前言
有管理后臺的地方,就肯定會有排序功能,有排序功能肯定就會要求良好的用戶體驗(yàn):置頂、置尾、交換、拖動。如何針對大數(shù)據(jù)量設(shè)計(jì)出簡單、高效的排序方案呢?且聽我細(xì)細(xì)道來...
操作說明
置頂:將該數(shù)據(jù)放到全局?jǐn)?shù)據(jù)的首位,其余數(shù)據(jù)保持順序不變。
image.png
置尾:將該數(shù)據(jù)放到全局?jǐn)?shù)據(jù)的末尾,其余數(shù)據(jù)保持順序不變。
image.png
-
交換:將兩個(gè)數(shù)據(jù)互換位置,其余數(shù)據(jù)順序保持不變。
image.png
拖動:將該數(shù)據(jù)拖動放到合適的位置,局部數(shù)據(jù)順序發(fā)生變化。如圖所示,需要將數(shù)據(jù)4拖動到數(shù)據(jù)1的后面,同時(shí)被拖動路徑覆蓋的數(shù)據(jù)2、3需要將順序往后順延。
image.png
DB設(shè)計(jì)
DB表須設(shè)計(jì)一個(gè)有符號排序字段,如:order_num。排序按照從小到大方式。
實(shí)現(xiàn)策略
- 置頂操作:將需要置頂?shù)臄?shù)據(jù)的 order_num 設(shè)置為全局Min(order_num) - 1
- 置尾操作:將需要置尾的數(shù)據(jù)的 order_num 設(shè)置為全局Max(order_num) + 1
- 交換操作:將需要交換的數(shù)據(jù)的 order_num 值互換即可。
- 拖動操作:將4插入到1的后面,將順序變動的數(shù)據(jù)4、2、3的 order_num 取出,然后對 order_num 進(jìn)行從小到大排序,依次賦值給4、3、2。
結(jié)束語
將 order_num 設(shè)計(jì)為有符號類型,會存在負(fù)值。但能很好的保證最小變動原則,高效的完成排序操作。新增記錄操作,可以默認(rèn)是置尾/置頂操作。理論上 order_num 是不會重復(fù)的,但可能不連續(xù)(因?yàn)橛袆h除操作)。管理后臺都會對數(shù)據(jù)進(jìn)行分頁,拖動一般也就是在本頁內(nèi)完成操作,如果嫌實(shí)現(xiàn)麻煩,完全可以將本頁的全部ID(排完序)都提交,反正也就一頁數(shù)據(jù)的 order_num 發(fā)生改變。



