2013-02-20 80 views
0

我正試圖實施比較評級系統,並且我很難找到處理此問題的最佳方法,尤其是從數據庫的角度來看。處理評級系統的最佳方式

讓我們以食物爲例。

爲用戶提供兩種不同食物的圖片,並且他選擇他更喜歡哪一種。然後顯示兩種食物(一種可以是相同的,或者它們可以不同),然後用戶再次選擇。他會一遍又一遍地這樣做,這樣做的時候,應用程序會告訴用戶他最喜歡的食物是什麼,完全取決於他說哪一個他比其他人更喜歡,並比較所有這些比較並顯示結果。

我以爲只是跟蹤每件物品的總喜歡/不喜歡,而且我也考慮跟蹤海量數據庫中的每一項選擇。我確信有一種我忽視的方式對於這種系統是有效的。

基本上,我不僅在尋找一個有效的算法,而且也是將其存儲在數據庫中的最佳方法。

感謝您的幫助。

+1

但是當您向開發者展示披薩和甜甜圈圖像時會發生什麼?他應該如何做出選擇? – 2013-02-20 07:31:35

+0

問題到底是什麼? – 2013-02-20 07:34:14

+0

我考慮向人們展示動物圖片,以確定他目前有什麼工作,他將擁有多少孩子,以及他是否喜歡披頭士樂隊。我應該怎麼做? (對不起,諷刺,我無法抗拒。) – 2013-02-20 07:38:43

回答

2

我只是保持一個數據庫的三元組(user_id, preferred_id, dispreferred_id)對應每個選擇。

編輯:有一點時間玩這個。以下幾百萬的收視率會很慢,並且吞噬了內存,但也可能會給你一些想法。如果你這樣做,你應該可以從crontab異步運行,而不是按需運行。

require 'set'                                                      

choices = [ 
    [1, 4], 
    [1, 5], 
    [2, 3], 
    [2, 4], 
    [3, 1], 
    [4, 2], 
    [4, 3], 
    [5, 1], 
    [6, 7], 
    [8, 4], 
] 

dominates = Hash.new { |hash, key| hash[key] = Set.new } 
choices.each do |p, d| 
    dominates[p].add(d) 
end 

prev_dominates = nil 
while dominates != prev_dominates 
    prev_dominates = Hash.new 
    dominates.each { |big, smalls| prev_dominates[big] = smalls.clone } 
    prev_dominates.each do |big, smalls| 
    smalls.each do |small| 
     if prev_dominates.include?(small) 
     prev_dominates[small].each do |smaller| 
      if smaller != big and !prev_dominates[smaller].include?(big) 
      dominates[big] << smaller 
      end 
     end 
     end 
    end 
    end 
end 

top = dominates.max_by { |big, smalls| smalls.size }[0] 

puts dominates.inspect 
puts "BEST: #{top}" 

頂端節點是最終支配最多其他節點的節點。但是,由於圖形可以是循環圖,如果另一個節點更早完成循環,我們會切斷循環。

+0

@Mitch - 會有類型的食物類別。像主菜,沙漠等 – 2013-02-20 07:40:04

+0

@JonathanPlumb:我不是米奇:p – Amadan 2013-02-20 07:40:25

+0

如果它不是食物,它會像名人一樣發生什麼事情,而且有數百萬乃至最終幾十億的比較結合在許多用戶之間......你會推薦一種不同的數據庫方法? – 2013-02-20 07:41:12