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避免使用服务器端资源,如游标。