2016-08-15 54 views
1

我正在構建一個網站,其中包含帖子票數表。每個投票點後,是向上或向下我應該在我的查詢中執行方程式,或者在本地執行方程式並更新db

如果我想用這樣的

def hotness(ups, downs, date): 
    s = ups - downs 
    order = log(max(abs(s), 1), 10) 
    sign = 1 if s > 0 else -1 if s < 0 else 0 
    seconds = epoch_seconds(date) - 1134028003 
    return round(sign * order + seconds/45000, 7) 

一個複雜的方程式職位排序它會更好於:

  1. 翻譯該公式爲sql,與投票執行連接,並在每次我想要獲取並對帖子列表進行排序時執行該公式。
  2. 在每個帖子上創建一個hotness列,並更新每次對帖子進行投票。

我可以看到與選項1的問題是,它會增加每個查詢的時間/複雜性,我可以看到與選項2的問題是,可能有1000票的第二個意思後,這意味着該職位需要不斷更新。

這樣做的最好方法是什麼?

回答

0

更重要的是:快速更新還是快速查找?如果你想要前者,可以選擇1;如果你想要後者,可以選擇2.選擇兩種方法的基準,並查看所得到的性能是否可以容忍。

順便說一下,選擇2可以維持hotness柱,以trigger

CREATE TRIGGER foo BEFORE UPDATE ON posts FOR EACH ROW SET NEW.hotness = ROUND(
    SIGN(ups-downs) * LOG10(GREATEST(ABS(ups-downs), 1)) 
    + (UNIX_TIMESTAMP(NEW.date) - 1134028003)/45000 
, 7); 

然後一個僅僅需要做UPDATE posts SET ups = ups + 1 WHERE id = ?或任何與hotness將自動更新。

如果這兩種解決方案都不能產生可接受的結果,則應考慮您可以在多大程度上爲僅定期緩存和更新的某個「活動」hotness值取捨。例如,不是在觸發器/每次投票中更新hotness,而是每隔一段時間執行一次批量更新。