2009-01-31 38 views
20

假設我有一些對象,並且我希望用戶能夠以任何他們希望的方式重新排序它們,例如拖動它們。所以我有如何將特定的可變「訂單」保存到數據庫中

  • 奶酪
  • 鬆餅
  • 牛奶

,然後用戶拖動 '牛奶' 頂端,使得新秩序

  • 芝士
  • 鬆餅

是否有最佳做法如何將這些對象的順序存儲在數據庫中?幼稚的做法可能只是爲每個對象存儲一個名爲「order」的數值,但這對我來說似乎太麻煩了,因爲大部分時間你都必須洗牌順序值。

+1

重複http://stackoverflow.com/questions/495390/orm-or-something-to-handle-sql-tables-with-an-order-column-有效 – cletus 2009-01-31 13:32:08

回答

11

你提出的「天真」的方法也是最好的做法!

2

如果你想讓它們以相同的順序重新顯示,並且你希望它們能夠在任何時候重新排序,我不認爲你可以避開存儲一些指示數據庫顯示優先級的值。我已經使用了你描述的方法來訂購FAQ中的項目,與授權相關的研究人員,菜單中項目的順序......

12

考慮到Tony Andrews的回答,每個條目的「下一個」索引。然後,當你將它們全部拉入時,請按照鏈條走過陣列。這使得移動項目變得更容易,因爲您只需觸摸最多兩行。

這種方法的缺點是,如果您需要一個子集(例如前3個項目),您仍然需要拉入所有項目或使用SQL循環。所以它在更新期間影響所有行,或者在讀取期間訪問所有項目。像以往一樣,測量速度,看看哪種更適合你的情況。

2

是的,在關係數據庫中沒有順序,這是基本概念之一。所以沒有數值或類似的東西就沒有辦法。

5

看着託尼·安德魯和馬克在特定的答案,看來我真的只有兩種選擇:

  • 保存「下一個」值,使得對象的行爲像一個鏈表(見馬克的回答)
    有了這個,改變訂單便宜,但我必須檢索項目和,然後排序他們的'下一個'價值,這是昂貴的
  • 保存'訂單'值(見託尼安德魯的答案)
    這使得檢索便宜,但節省一個新的奧德因爲在最壞的情況下,我不得不改變所有的訂單價值。 cletus指出,可以使用2^n形式的大數作爲訂單乘數。

元:所有這些答案是好的,正確的,哪一個我應該選擇是正確的?

+0

既然你問到在數據庫中存儲,我會投票支持「天真」的方法..通過最初插入對象的偏移量,比如說100,你可以最小化重新排序衝突(當你有改變多個對象以重新插入新位置) – lexu 2009-01-31 13:56:49

+3

兩者都不是絕對100%「最佳」。如果讀取方式多於寫入方式,則檢索速度可能是主要問題。如果您有很多寫入或必須訂購大量項目,則寫入速度非常重要。這是一個逐案判斷。 – Tadmas 2009-01-31 14:32:10

3

在我的應用程序中,讀操作將比寫操作更頻繁地發生。用數字值表示排序順序並處理重新排序項目的成本。由於您可以以正確的順序高效地檢索項目以進行顯示(在典型應用程序中執行操作比執行操作更頻繁),所以這不僅僅是爲了彌補這一點。另外,如前所述,如果您檢索數據的子集(對類型或其他內容進行過濾),則其餘項目仍按照正確的排序順序排列。

記住咒語K.I.S.S.

14

我發現處理這個問題的最好方法是有一個浮點順序字段。當您在兩個其他項目之間移動某個項目時,請將該項目設置爲其鄰居之間的一半。

這對於讀取和寫入都很便宜。唯一的缺點是花車不斷變長:)

相關問題