0

我需要編寫一個始終返回整數值的方法。如果記錄不存在,該方法返回0什麼是更聰明的選擇:Ruby邏輯或SQL函數?

我有被查詢並有兩個解決方案來了個列的唯一索引:

# Option a) Ruby logic 
def some_method id 
    result = Model.some_scope.find(:first, 
            conditions: { foo_id: id }, 
            select: :int_value) 

    # Return 0 if record does not exist: 
    (result.nil? ? 0 : result.int_value) 
end 


# Option b) Allow Postgres to do the work 
def some_method id 
    # sum() returns 0 if the record wasn't found 
    Model.some_scope.where(foo_id: id).sum(:int_value) 
end 

因爲獨特的指數,這兩種方法返回相同的價值。

除了簡潔之外,有沒有什麼理由說一種解決方案比另一種更好?

我的傾向是選擇基於服務器資源的解決方案,即通過將工作交給Ruby來最小化數據庫服務器負載。


運行的Ruby 1.9.3和Postgres 9.1

回答

4

你不需要的(可能更昂貴)聚合函數sum()
爲此使用SQL-COALESCE()

COALESCE可能是最便宜的方法。但成本太微不足道,無論哪種方式。

+2

一致認爲,當你處理這種規模的工作時,負載只有沒有意義的區別。查詢設置和返回的開銷遠遠大於其他任何部分。如果您擔心性能問題,可以考慮在更高級別上彙總工作,以便一次向數據庫提交大量結果。 –