假設我有一些對象,並且我希望用戶能夠以任何他們希望的方式重新排序它們,例如拖動它們。所以我有如何將特定的可變「訂單」保存到數據庫中
- 奶酪
- 鬆餅
- 牛奶
,然後用戶拖動 '牛奶' 頂端,使得新秩序
- 奶
- 芝士
- 鬆餅
是否有最佳做法如何將這些對象的順序存儲在數據庫中?幼稚的做法可能只是爲每個對象存儲一個名爲「order」的數值,但這對我來說似乎太麻煩了,因爲大部分時間你都必須洗牌順序值。
假設我有一些對象,並且我希望用戶能夠以任何他們希望的方式重新排序它們,例如拖動它們。所以我有如何將特定的可變「訂單」保存到數據庫中
,然後用戶拖動 '牛奶' 頂端,使得新秩序
是否有最佳做法如何將這些對象的順序存儲在數據庫中?幼稚的做法可能只是爲每個對象存儲一個名爲「order」的數值,但這對我來說似乎太麻煩了,因爲大部分時間你都必須洗牌順序值。
你提出的「天真」的方法也是最好的做法!
如果你想讓它們以相同的順序重新顯示,並且你希望它們能夠在任何時候重新排序,我不認爲你可以避開存儲一些指示數據庫顯示優先級的值。我已經使用了你描述的方法來訂購FAQ中的項目,與授權相關的研究人員,菜單中項目的順序......
考慮到Tony Andrews的回答,每個條目的「下一個」索引。然後,當你將它們全部拉入時,請按照鏈條走過陣列。這使得移動項目變得更容易,因爲您只需觸摸最多兩行。
這種方法的缺點是,如果您需要一個子集(例如前3個項目),您仍然需要拉入所有項目或使用SQL循環。所以它在更新期間影響所有行,或者在讀取期間訪問所有項目。像以往一樣,測量速度,看看哪種更適合你的情況。
是的,在關係數據庫中沒有順序,這是基本概念之一。所以沒有數值或類似的東西就沒有辦法。
看着託尼·安德魯和馬克在特定的答案,看來我真的只有兩種選擇:
元:所有這些答案是好的,正確的,哪一個我應該選擇是正確的?
在我的應用程序中,讀操作將比寫操作更頻繁地發生。用數字值表示排序順序並處理重新排序項目的成本。由於您可以以正確的順序高效地檢索項目以進行顯示(在典型應用程序中執行操作比執行操作更頻繁),所以這不僅僅是爲了彌補這一點。另外,如前所述,如果您檢索數據的子集(對類型或其他內容進行過濾),則其餘項目仍按照正確的排序順序排列。
記住咒語K.I.S.S.
我發現處理這個問題的最好方法是有一個浮點順序字段。當您在兩個其他項目之間移動某個項目時,請將該項目設置爲其鄰居之間的一半。
這對於讀取和寫入都很便宜。唯一的缺點是花車不斷變長:)
重複http://stackoverflow.com/questions/495390/orm-or-something-to-handle-sql-tables-with-an-order-column-有效 – cletus 2009-01-31 13:32:08