2013-12-14 28 views
0

我有兄弟數據,用戶需要定義一個「官方」的訂單,不按字母順序排列某個名稱,按創建/發佈日期,按值(如工資,銷售額或職級)。排序順序管理 - 不滿足SortOrder * 10^n或鏈接列表實現

SortOrder的* 1^N

我的數字,例如可排序的對象將需要具有整數SortOrder柱,其中更小的值意味着更靠近第一項(SortOrder = 1意味着第一項)。

許多人建議在插入新記錄時自動分配SortOrder = newId * 1000(n = 3)。後來下了線,我們會插入一條記錄,兩個記錄之間,並且插入的記錄的排序順序將被設爲

inserted.SortOrder = (previous.SortOrder + next.SortOrder)/2 

啊,但是這樣做足夠的時間,你會用完的「精確」 - 什麼當previous.SortOrder = 3000和next.SortOrder = 3001時,您將分配給插入記錄的排序順序?

增加n值,你只是推遲了這個問題。


鏈表實現

一些建議有NextRecordId。這樣,我們就有記錄的「蹤跡」。插入兩者之間的記錄只需要兩個更新 -

previous.NextRecordId = inserted.Id 
inserted.NextRecordId = next.Id 

而且項目如下next不會受到影響。

這似乎是一個很好的建議,但有問題。

如何將數據以正確的順序顯示? ORDER BY NextRecordIdASCDESC)將不起作用。對於ORDER BY ASC,它將首先選擇NextRecordId最小的記錄。這不是我們想要的順序。

看來我們必須迭代(在存儲過程中),並且每次迭代都需要SELECT WHERE [email protected],然後將每個結果放在一個新表中。

您將如何跟蹤哪個記錄是第一個 - 有一個IsFirst列,或在父表中有FirstChildRecordId?我們可以說NextRecordId = 0的記錄是最後一個。看起來像在數據庫中創建列來實現數據結構不是一個好主意,不是嗎?


所以,我被困在這個,我已經通過這個論壇和在線搜索 - 找不到一個好的解決方案。他們都似乎需要某種後期維護(重新播種,但你如何確定何時)或每次排序「移動」可能需要昂貴的計算(更新插入索引後的所有記錄的排序順序)。

任何新的見解或技巧?

回答

1

具有靈活排序順序的一種方法是使用字符串而不是數字。

最初爲排序順序分配零填充數字:'001''002'。 。 。

然後,當您想要在兩個值之間添加某個內容時,只需將一個5添加到該值。字符串的排序將'001','0015''002'按您想要的順序排列。

當然,您可以通過測試最後一位數字來提高效率。如果它是'5',並且你想要更大的東西,可以放入7或8.你還可以通過擴展字符集以包含字母和數字來提高效率。