2011-06-22 17 views
2

假設我們有一個包含以下數據的簡單數據庫:操縱排序結果考慮到用戶的偏好 - 數據庫

 name 
     apple 
     pear 
     banana 
     grape 

用戶希望將這些水果中的名稱進行排序,我們都會有,沒有驚喜

  apple 
     banana 
     grape 
     pear 

然而,出於某種原因,用戶想向pear是第三個水果,這意味着他想有:

  apple 
     banana 
     pear 
     grape 

而且,重要的是,用戶希望在此後按名稱對水果進行分類時,保留此訂單。

我們應該如何解決這個問題?在我的頭頂上,我們可以添加一個字段user_sort_id,當用戶對排序結果進行排序和操作時,這些字段將被更新,我們將使用該字段作爲排序關鍵字。

     init value  -> sort by name   ->place pear as the seconds 
     name   user_sort_id 
     apple   0      0       0 
     pear    1      3       2 
     banana   2      1       1 
     grape   3      2       3 

這種方法應該在理論上工作。但是,在實踐中,我想不出一個可以實現這一點的優雅和快速的SQL語句。任何想法或選擇?

+0

我可以問一下,如果您添加胡蘿蔔,例如它會發生什麼。香蕉或胡蘿蔔後出現梨串嗎? – niktrs

+0

隱藏的排序鍵實際上是唯一的解決方案,因爲否則沒有規則來排序項目。排序鍵必須是用戶特定的。過去對Netflix的隊列非常惱火的一件事是明確地操作了排序鍵。他們應該至少*以10爲增量編號,以使重新排序更簡單。 – wallyk

+0

@niktrs:好問題。我想我會把它放在最後,不管名字如何,直到你做另一種。在我們的案例中,實際上我們不考慮新插入的情況。 – pierrotlefou

回答

1

如果您希望每個用戶都有獨立的排序順序,您需要另一個表。

CREATE TABLE user_sort_order (
    name VARCHAR(?) NOT NULL REFERENCES your-other-table (name), 
    user_id INTEGER NOT NULL REFERENCES users (user_id), 
    sort_order INTEGER NOT NULL    -- Could be float or decimal 
); 

然後訂購很容易。

SELECT name 
FROM user_sort_order 
WHERE user_id = ? 
ORDER BY sort_order 

有沒有更新的靈丹妙藥。

  • 刪除所有用戶的行,並用新訂單插入行。 (蠻力始終有效。)
  • 用新訂單更新每一行。 (可能是很多UPDATE語句。)
  • 跟蹤應用程序中的更改,並僅更新已更改的行和必須被更改「碰撞」的行。 (Parsimonious,但容易出錯。)
  • 不要讓用戶強加他們自己的排序順序。 (通常沒有聽起來那麼糟糕。)
+0

問題是我應該如何更新sort_order? – pierrotlefou

+0

+1是的,這種方法起作用。我正在尋找比這種強力方法更好的方法。 – pierrotlefou

+0

「蠻力」在這裏是一個模糊的術語。第三種選擇 - 跟蹤應用程序級別的更改,並僅更新需要更改的行 - 不是強力,但可能需要每個更改的行都有一個SQL語句。第一個選項 - 刪除所有用戶的行並使用新訂單插入行 - 可能只需要兩條SQL語句。(在PostgreSQL下,它可以用兩個SQL語句完成。) –