Database design OrientDB——类似twitter的实现和排序

Database design OrientDB——类似twitter的实现和排序,database-design,nosql,graph-databases,orientdb,Database Design,Nosql,Graph Databases,Orientdb,我正在构建一个简单的图,我想问一下您的建议,当它添加了更多的顶点和边时,它仍然会表现得很好。我的图表的布局是这样的 user --> follows --> user (userVertex) user --> generates --> activity (activityVertex) 这是我的疑问: select from ( select flatten(out[label='generates'].in) from ( select flatte

我正在构建一个简单的图,我想问一下您的建议,当它添加了更多的顶点和边时,它仍然会表现得很好。我的图表的布局是这样的

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子句

where @class = 'activityVertex'
and id < 1234
limit 20
其中@class='activityVertex'
id<1234
限制20
其中,上面的
1234
是显示的最后一个活动的id

当一个人跟随<10个用户并且每个用户有<500个活动时,这一切都很好。但是,当它变得比这更大时,它会对按日期排序所有活动的
orderby
子句施加这样的压力,以便将活动流呈现给用户


我想知道twitter是怎么做到的?是否有一些设计原则,甚至那些与OrientDB没有严格相关的原则,我还没有应用,这将使这成为可能?

您可以使用SKIP关键字。跳过+限制完成以下魔术:

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

这是个好建议。但是假设select查询中总共有10000个活动,并且您按id对它们进行排序,orient仍然必须按
id
desc对所有这些顶点进行排序,然后跳过20个,不是吗?是的,这样做并不轻松,但很有效。这是因为OrientDB避免使用服务器端资源,如游标。