2012-08-11 32 views
1

我正在構建一個簡單的圖,我想問你的建議如何做到這一點,以便當它獲得更多的頂點和邊添加時,它仍然會表現很好。我的圖形佈局是這樣的。OrientDB - 微博喜歡實現和訂購

user --> follows --> user (userVertex) 
user --> generates --> activity (activityVertex) 

這是我的查詢:

select 
from (
select 
flatten(out[label='generates'].in) 
from (
    select 
    flatten(out[label='follows'].in) 
    from #6:0 
) 
) 
where @class = 'activityVertex' 
order by id desc 
limit 20 

,當我做分頁(例如,表現出更多的活動),我只需添加這對where clause

where @class = 'activityVertex' 
and id < 1234 
limit 20 

其中上述1234是顯示最後一個活動的ID。

當人們像<這樣10個用戶並且每個用戶有像< 500個活動一樣遵循時,這是工作良好的狀態。但是當它變得比這更大時,它會在按照日期排列所有活動的order by子句上施加這樣的壓力,以向用戶呈現活動流。

我想知道twitter是如何做到的?是否有一些設計原則,即使那些與OrientDB不相關的設計原則,我還沒有申請,這將使這成爲可能?

回答

0

您可以使用SKIP關鍵字。 SKIP + LIMIT做到這一點:

SELECT ... SKIP 0 LIMIT 20 // 1st page 
SELECT ... SKIP 20 LIMIT 20 // 2st page 
SELECT ... SKIP 40 LIMIT 20 // 2st page 
+0

這是一個很好的建議。但假設select查詢中總共有10,000個活動,並且您通過id對它們進行排序,orient仍然必須通過'id' desc命令所有這些頂點,然後跳過20不是嗎? – voldomazta 2012-08-12 14:25:09

+0

是的,它不是很輕,但工作。這是因爲OrientDB避免使用遊標等服務器端資源。 – Lvca 2012-08-26 11:17:22