我有兄弟數據,用戶需要定義一個「官方」的訂單,不按字母順序排列某個名稱,按創建/發佈日期,按值(如工資,銷售額或職級)。排序順序管理 - 不滿足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 NextRecordId
(ASC
或DESC
)將不起作用。對於ORDER BY ASC
,它將首先選擇NextRecordId最小的記錄。這不是我們想要的順序。
看來我們必須迭代(在存儲過程中),並且每次迭代都需要SELECT WHERE [email protected]
,然後將每個結果放在一個新表中。
您將如何跟蹤哪個記錄是第一個 - 有一個IsFirst
列,或在父表中有FirstChildRecordId
?我們可以說NextRecordId = 0
的記錄是最後一個。看起來像在數據庫中創建列來實現數據結構不是一個好主意,不是嗎?
所以,我被困在這個,我已經通過這個論壇和在線搜索 - 找不到一個好的解決方案。他們都似乎需要某種後期維護(重新播種,但你如何確定何時)或每次排序「移動」可能需要昂貴的計算(更新插入索引後的所有記錄的排序順序)。
任何新的見解或技巧?