2013-08-02 83 views
0

我們有拉特和長記錄的對象。 另外每個對象都有創建日期。如何通過函數結果實現快速排序?

用戶可以從任何地方登錄並查看對象。 我們需要通過一些特殊的索引來顯示對象的排序,這些索引是根據對象的新鮮程度以及與當前用戶的距離來計算的。

可以說我們在紐約和澤西島有對象。 如果您從紐約登錄,您應該在頂部看到New-Yorks對象,然後看到Jersey對象。但是,舊紐約的物品應該低於新球衣的物品。

我們可以近似函數F =在一天<對象新鮮感> + <從當前用戶點距離對對象的公里數的地方>

我們使用PostgreSQL用於存儲數據,我們可以真的只是排序等功能並得到我們需要的東西。 問題是我們擔心它會工作得很慢,因爲我們打算到達像1k-10k對象和100-300個位置,並且應用程序必須很快返回結果(因爲它就像應用程序中最重要的東西一樣)

用戶將從不同的地方添加對象。

如何提高此類查詢的性能您有任何想法嗎?

回答

1

相反,您可以根據以下內容進行排序:distance - object_creation_time。你不需要在每次排序時重新評估這個函數,因爲它的值不會改變。

+0

對不起,沒有得到它,根據什麼?那麼該函數將接收當前用戶的兩個參數< lat, long >。物體的「新鮮度」每天都會改變。 –

+0

@ user909291你能否更詳細地解釋如何實現<>?它是表中的某個數字或日期/時間戳列嗎? 「新鮮度每天都在變化」是什麼意思,每天(或每晚)有沒有工作計算新的<>並更新整個表格? – krokodilko

+0

不,不。首先它還沒有實施,我們只是在想它。說「新鮮」我的意思是從創建日期開始的天數。我們將有日期時間字段(創建日期)。但是我們可以創建工作,無論如何,如果它有意義 –

-1

在Postgres中,索引不一定只在列或列的元組上...您可以在函數上創建索引,如Postgres documentation.中所述如果您使用相同的函數進行查詢,索引應該使用。

+0

只能爲函數創建基於函數的索引,這些函數引用表中的列。在這種情況下,函數指的是**從當前用戶點到對象位置的距離,單位爲km **,這個值並不存儲在表中,因此在這種情況下基於函數的索引是無用的。 – krokodilko

+0

你是對的 - 我錯過了這是對用戶的當前位置,而不是對任意的固定點。的Bleh。 – dcsohl