需求是這樣的,有一個商城系統,需要在后臺對商品進行排序,也就是可以隨意改變一個商品展示順序,我想的是在商品表中添加一個表示順序的欄位,但是這樣有個問題,如果有上萬個商品,每次更改一個商品順序可能其它的商品的順序欄位不是也要改,這樣效率肯定會很低,請問應該怎么解決。最好是hibernate能用的方法
uj5u.com熱心網友回復:
首先,你將序號設定成數字,便于索引和排序提高效率。比方初始化1萬個商品,分別是1~10000對應的序號。
設計規則如下:
1、程式根據序號進行order by并以串列的形式展現給用戶。用戶界面分頁顯示,分頁序號按照結果集自動加1
2、你在后臺進行商品管理的時候,發現需要移動位置,那么你直接改變序號數值就行了,序號甚至可以設定成小數,只要不影響排序結果就行了。
3、如果糾結序號正數的話,可以人工觸發序號整理,即在你手動設定好排序后,可能其中有小數。那么只要執行下面的陳述句即可
(大概意思)
update (
select xuhao,rownum from product order by xuhao
) set xuhao=rownum
注意,用戶端看到的序號和你管理端的排列序號不是一個概念。
uj5u.com熱心網友回復:
假如有3個商品,序號是分別是1、2、3,現在需要把序號為3的商品序號改為1,那么就會影響到原來的所有商品,也就是說我只改一個商品的排序,就要把其它的資料也進行操作,這樣很影響性能,我就是想怎么解決這個問題
uj5u.com熱心網友回復:
123-->312這種插入 如何解決?12要往后挪一位的狀況?如果資料量小還好 如果資料量很大 這個for回圈將非常消耗性能???????沒有解決辦法?uj5u.com熱心網友回復:
簡單的需求設計,加一個排序欄位,這個欄位存時間戳,到毫秒的那種,按照這個欄位倒敘排序即可,當你要把某個商品置頂,你就插入當前時間戳就可以了,如果你想吧某個商品插入都某個商品的前后,吧那個商品的時間戳拿過來加減一就可以了。uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
建議使用linked系列,這樣會效率高一些uj5u.com熱心網友回復:
不知道我的理解是不是正確.你是要原先的排序不變,隨機移動1個元素到指定位置.查詢SQL不變,回傳的list取得你想要的元素移動到list指定位置.uj5u.com熱心網友回復:
正常情況下,如果是要求絕對的順序,肯定不會有太大的資料量,如果資料量很大,就不會要求絕對的順序。谷歌、百度、淘寶等的搜索絕對不會要求哪條資訊一定要排在哪個位置。
如果你還是希望要絕對的順序,而且資料量也很大,不希望每次修改都重排序。那就建議不要用mysql資料庫。自己實作一個紅黑樹之類的結構,保證性能杠杠的。
uj5u.com熱心網友回復:
根據你所說我覺得一般就是保證前幾頁商品的順序,后面的排序其實沒什么意義。
例如:確保20個商品有優先級別,其他的都一樣,修改時只要修改有優先級別的20條就行了。
uj5u.com熱心網友回復:
真有意思,沒有添加這個排序欄位的時候,難道,后臺查詢就不排序了么?樓主的思維有些死板了,你添加的欄位的主要功能是排列那些特殊商品,還是要排列所有的商品?
排列所有的商品,為什么不用id來排序呢?
啥意思? 就是說,你添加一個排序欄位,這個欄位,只排列那些后臺人工設定過先后順序的記錄,其余的記錄,按照默認的排序規則就好。
怎樣達到這個目的?
新增欄位,默認設定成0 , 后臺更改順序的時候,所有的排序值都是大于0的,也就是說,這個順序是由大到小,倒敘排列的,或者說,你查詢的時候,優先按照這個欄位倒敘排列出結果就可以了。
至于人工更改的那幾條資料,前后順序,調整數值大小的事情,要么編程自動更新這幾個記錄,要么,人工改一下排序值就可以了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/47773.html
標籤:Java EE
上一篇:delphi怎樣執行緒并發
