自定義排序之資料庫設計
之前做過的專案有項需求,就是要對乙個普通的列表進行自定義排序功能,當初構思了幾個方案,各有所長,按需使用,下面就一一來介紹這幾個方案。
注:這裡的自定義排序就是操作列表的某項進行位置交換。
1. 單錶單列結構(陣列結構)
此設計是使用乙個表中的一列來表示資料的序號,通常我們使用的方法就是這種。
資料表tb_data(n):
dataindex
這裡規定序號從0開始遞增。
其基本資料操作如下:
增 → 當增加乙個資料時,定義data的序號為資料總數量值。
刪 → 當刪除乙個資料時,將大於該序號的資料的序號都減1。
改 → 當修改位置將資料a從x移動到y時,若x小於y,則將(x,y]範圍內的資料序號都減1;若x大於y,則將[y,x)範圍內的資料序號都加1(注:修改資料庫時,要先將a的序號x修改為未被使用的序號z,然後再修改範圍內的資料,最後再將z修改為y,順序不能亂)。
查 → 當查詢資料時新增 order by index 即可得到自定義排列的資料,查詢第n個資料時查詢條件為 index=n-1 即可。
總結:此方法查詢速度最快,修改速度最慢。
2.單錶雙列結構(鍊錶結構)
此設計是使用乙個表中的兩列來表示資料的序號,一列表示該資料的前置id,一列表示該資料的後置序id(id為資料表本身的自增序號),即相當於我們經常使用的雙向鍊錶。
資料表tb_data(n):
iddatapre_nonext_no
-1-1
這裡規定第乙個資料的pre_no為-1,最後乙個資料的next_no為-1。
其基本資料操作如下:
增 → 當增加乙個資料a時,先查詢出最後乙個資料b的id號,a的pre_no定義為b的id號(若此資料為第乙個則定義為-1),next_no定義為-1,再將b的next_no定義為a的id號。
刪 → 當刪除乙個資料a時,取出a的pre_no和next_no,將pre_no對應的id的資料的next_no修改為a的next_no,將next_no對應的id的資料的pre_no修改為a的pre_no。
改 → 令位置x-1、x+1資料分別為b、c,位置y-1、y、y+1的資料分別為d、e、f,現修改位置將資料a從x移動到y時,
當x小於y時,修改b的next_no為c的id,修改c的pre_no為b的id,修改e的next_no為a的id,修改f的pre_no為a的id,最後修改a的pre_no為e的id,next_no為f的id;
當x大於y時,修改b的next_no為c的id,修改c的pre_no為b的id,修改d的next_no為a的id,修改e的pre_no為a的id,最後修改a的pre_no為d的id,next_no為e的id。
查 → 當查詢第n個資料時,需要先查詢出第乙個資料,在根據第乙個資料逐個往後查詢資料的next_no,查詢n次後得到第n個資料。
總結:此方法查詢速度最慢,修改速度最快。
3.雙表雙列結構(分頁結構)
此設計是使用乙個頁碼表記錄全部頁碼和頁碼的序號範圍,另乙個資料表來記錄基本資料、自身序號和頁碼,通過在乙個表中給資料設定不同的序號和頁碼來達到分頁排序的效果。
頁碼表tb_page:
tb_namepagestart_indexend_index
tb_data0
tb_data0
tb_data0
tb_data1
tb_data1
table_name為乙個基本資料表的表名,對於每乙個table_name,其對應的page都從0開始遞增且不能重複,每個page有一定的資料範圍(這裡設定為一頁有1000條資料),則每個資料表對應的資料總量即可計算出來。
基本資料表tb_data(n):
datapageindex
data為資料域,記錄基本資料,對於每乙個不相同的data都有對應的page和index,通過page、index和每一頁的資料範圍即可計算出對應的全域性序號。
其基本資料操作如下:
增 → 當增加乙個資料時,先從頁碼表中查詢出最後的page及其對應的start_index和end_index,若end_index-start_index+1沒有資料超出範圍,則插入資料的page不變,index為end_index+1,若超出範圍,則需在頁碼表中新建一頁,插入資料的page自加一,index賦值初始值。
查 → 當查詢資料總量時,可以通過查詢頁碼表計算得出;當查詢序號為n的資料時,可以通過頁碼表計算得到對應的page和index,然後再通過查詢資料表取得資料(由於頁碼表的資料會經常使用,所以最好從資料庫取出一次後儲存在記憶體中再進行使用即可提高速度)。
總結:此方法查詢速度和修改速度比較均衡,適合大多數情況使用。
MySQL自定義排序
select from table where id in 2,3,4,1,5 order by field id,2,3,4,1,5 select from table where id in 2,3,4,1,5 order by field id,2,3,4,1,5 asc select fro...
mysql自定義排序
1 mysql自定義排序,指定排序輸出 select case when ajj whcd then 未知 when ajj whcd in 初中 中學 then 初中 when ajj whcd in 中專 中技 中專 中技 中師 技工 技校 普高 職專 職中 高中 高中?then 高中 when...
Mysql自定義排序
mysql自定義排序 最近做專案時碰到乙個排序的問題,資料庫中有乙個字段需要按照 0,1,1 的順序來查詢資料庫。無論是正序還是逆序都滿足不了要求,經過查詢,下面的方法可以滿足要求 select from user order by field status 0,1 1 order by field...