如何以最小代價實現商品列表的拖動排序功能?

如何以最小代價實現商品列表的拖動排序功能?

高效實現商品列表拖拽排序:最小代價方案

前端商品列表的拖拽排序功能,尤其是在支持跨頁排序的情況下,需要巧妙的數據庫設計和算法來保證效率。本文介紹一種低成本、高效率的方案,無需大幅修改商品添加和修改邏輯。

假設數據庫中已存在sort字段,初始值為0,商品列表按時間倒序排列。我們的目標是通過拖拽操作更新sort值,實現排序。

初始化sort字段:

首先,我們需要初始化sort字段,為每個商品分配一個排序值,并預留足夠的空間避免沖突。 我們可以使用以下sql語句,為每個商品分配一個遞增的排序值,并設置較大的間隔(例如1000):

SET @sort := 0; UPDATE product SET sort = (@sort := @sort + 1000) ORDER BY id;

例如,初始數據可能如下:

id sort
1 1000
2 2000
3 3000

拖拽排序算法:

當用戶拖拽商品時,我們只需要更新被移動商品以及受影響商品的sort值。 假設用戶將商品3移動到商品1和商品2之間,我們可以計算商品3的新sort值:

新 sort 值 = 商品1的 sort 值 + (商品2的 sort 值 – 商品1的 sort 值) / 2

例如,商品3的新sort值將是: 1000 + (2000 – 1000) / 2 = 1500

為了避免排序值過于集中,可以在計算中間值時添加少量隨機數。 更新后的數據如下:

id sort
1 1000
3 1500
2 2000

避免排序值過于密集:

隨著拖拽操作次數增加,排序值可能會過于密集,導致后續排序困難。 為了解決這個問題,我們可以定期重新分配sort值,保持足夠的間隔。 可以使用以下sql語句

SET @sort := 0; UPDATE product SET sort = (@sort := @sort + 1000) ORDER BY sort;

這個方法通過重新排序并分配sort值,確保排序值之間保持足夠的間隙,從而保證排序算法的長期有效性。

總結:

通過以上方法,我們可以以最小代價實現商品列表的拖拽排序功能,并保持排序算法的長期穩定性,同時無需大幅修改商品添加和修改的邏輯。 這種方法利用預留的排序值空間和定期重新分配機制,有效解決了排序值密集的問題,提高了排序效率。

? 版權聲明
THE END
喜歡就支持一下吧
點贊6 分享