如何優(yōu)雅的實(shí)現(xiàn)數(shù)據(jù)置頂、置尾、交換、拖動排序?

前言

有管理后臺的地方,就肯定會有排序功能,有排序功能肯定就會要求良好的用戶體驗(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ā)生改變。

本系列文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容