2013-01-24 47 views
0

假設您正在Netflix上對隊列中的項目進行重新排序。對於我看過的每一個例子,當你把最後一個項目移到最上面時,它會一次一個地更新數據庫中的每個記錄。使用單個數據庫更新解決項目

1. One Fine Day    ==> change sort order from 1 to 2 
2. Two and a Half Men  ==> change sort order from 2 to 3 
3. Three Kings (move to top) ==> change sort order from 3 to 1 

有沒有更好的方法來做到這一點?也許每次你重新訂貨時只需要一次數據庫更新?試想一下:

1. One Fine Day    ==> do nothing (sort order stays at 1) 
2. Two and a Half Men  ==> do nothing (sort order stays at 2) 
3. Three Kings (move to top) ==> change sort order from 3 to 0 

移動其他兩個項目之間的項目將分割排序順序之間的區別:

1. One Fine Day    ==> do nothing (sort order stays at 1) 
2. Two and a Half Men  ==> do nothing (sort order stays at 2) 
3. Three Kings (move to mid) ==> change sort order from 3 to 2.5 

要多走一步,我們可以使用更大的字符集的不僅僅是數字,也許會去base64並按字母順序排序,這會讓您在無限重新排序所有項目以保持項目之間的工作空間之前進行無限的訴諸。

總而言之,什麼是最聰明的方式來擊中你的數據庫時訴諸?

回答

0

你的情況,我的理解是,如下所示:

  1. 爲了簡單起見,我們假設我們有3個表MoviesUsersUserPreferenes(最後一個,與列UserIdMovieIdOrdinal)。
  2. 每當用戶更改他喜歡的電影的排序時,我們應該更新UserPreferences表。
  3. 但是,這通常需要更新Ordinal至少2個記錄(有一些例外,但我不是在縮小,整體邏輯的情況下)
  4. 所以,問題是:我們如何才能避免多個更新並只更新一條記錄?

如果以上方法正確,解決方法是denormalization。有沒有通用的解決方案,並與您會選擇每個方向的注意事項的風險,有幾個選擇,我建議你應該考慮:

  1. 要有不是三個,但在UserPreferences只有兩列通過保留UserId列並將用戶喜愛的電影ID序列存儲在另一列OrderedMovieIds中。

  2. 向該Ordinal列轉換成有限數目這將指示用戶的喜好的列:Ordinal1Ordinal2,... OrdinalN(當然這是由列的表最大數量的限制)。

相關問題