前言
有管理后臺(tái)的地方炼列,就肯定會(huì)有排序功能只搁,有排序功能肯定就會(huì)要求良好的用戶體驗(yàn):置頂、置尾俭尖、交換氢惋、拖動(dòng)。如何針對(duì)大數(shù)據(jù)量設(shè)計(jì)出簡(jiǎn)單稽犁、高效的排序方案呢焰望?且聽(tīng)我細(xì)細(xì)道來(lái)...
操作說(shuō)明
置頂:將該數(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
拖動(dòng):將該數(shù)據(jù)拖動(dòng)放到合適的位置,局部數(shù)據(jù)順序發(fā)生變化捆姜。如圖所示足陨,需要將數(shù)據(jù)4拖動(dòng)到數(shù)據(jù)1的后面,同時(shí)被拖動(dòng)路徑覆蓋的數(shù)據(jù)2娇未、3需要將順序往后順延。
image.png
DB設(shè)計(jì)
DB表須設(shè)計(jì)一個(gè)有符號(hào)排序字段星虹,如: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 值互換即可宽涌。
- 拖動(dòng)操作:將4插入到1的后面平夜,將順序變動(dòng)的數(shù)據(jù)4、2卸亮、3的 order_num 取出忽妒,然后對(duì) order_num 進(jìn)行從小到大排序,依次賦值給4、3段直、2吃溅。
結(jié)束語(yǔ)
將 order_num 設(shè)計(jì)為有符號(hào)類型,會(huì)存在負(fù)值鸯檬。但能很好的保證最小變動(dòng)原則决侈,高效的完成排序操作。新增記錄操作喧务,可以默認(rèn)是置尾/置頂操作赖歌。理論上 order_num 是不會(huì)重復(fù)的,但可能不連續(xù)(因?yàn)橛袆h除操作)功茴。管理后臺(tái)都會(huì)對(duì)數(shù)據(jù)進(jìn)行分頁(yè)庐冯,拖動(dòng)一般也就是在本頁(yè)內(nèi)完成操作,如果嫌實(shí)現(xiàn)麻煩坎穿,完全可以將本頁(yè)的全部ID(排完序)都提交展父,反正也就一頁(yè)數(shù)據(jù)的 order_num 發(fā)生改變。