gpt4 book ai didi

asp.net-mvc - 使用RavenDB的类似Twitter的模型

转载 作者:行者123 更新时间:2023-12-02 04:00:52 24 4
gpt4 key购买 nike

我正在和Raven一起玩耍,尝试找出最好的方法是为类似Twitter的场景建模对象。到目前为止,我已经提出了一些选择,但是不确定哪个是最好的。

public class User{
public string Id{get;set;}
public List<string> Following{get;set;}
public List<string> Followers{get;set;}
}

User对象非常简单明了,只是一个ID和我关注的人以及关注我的人的ID列表。 Feed设置是我需要帮助的地方,可以从我关注的用户那里获取所有帖子。

选项1-简单的路线

这会根据他们的UserId搜索我关注的人的所有帖子。
public class Post{
public string UserId{get;set;}
public string Content{get;set;}
}

指数
public class Posts : AbstractIndexCreationTask<Post>{
public Posts(){
Map = results => from r in results
select new{
r.UserId
};
}
}

查询方式
var posts = session.Query<Post,Posts>().Where(c=>c.UserId.In(peopleImFollowing));

这是显而易见的路线,但闻起来很不好。该查询导致一堆OR语句发送到Lucene。 Raven可以处理的上限大约为1024,因此任何一个用户最多只能关注1000个人。

选项2-每个关注者一个帖子
public class Post{
public string UserId{get;set;}
public string RecipientId{get;set;}
public string Content{get;set;}
}

添加新帖子
foreach(string followerId in me.Followers){
session.Store(new Post{
UserId = me.UserId,
RecipientId = followerId,
Content = "foobar" });
}

这很容易遵循,也很容易查询,但是似乎创建了太多文档……也许没关系吗?

选项3-收件人列表

到目前为止,我最喜欢这个。
public class Post{
public string UserId{get;set;}
public List<string> Recipients{get;set;}
public string Content{get;set;}
}

指数
public class Posts : AbstractIndexCreationTask<Post>{
public Posts(){
Map = results => from r in results
select new{
UserId = r.UserId,
Recipient = r.Recipients
}
}
}

添加新帖子
session.Store(new Post{
UserId = me.Id,
Recipients = me.Followers,
Content = "foobar"
});

查询方式
var posts = session.Query<Post,Posts>().Where(c=>c.Recipient == me.Id);

这似乎是最好的方法,但我以前从未与Lucene合作过。如果某人有10,000个关注者,对索引是否会有问题?如果我们想发布发给每个用户的消息怎么办?也许还有另一种方法?

最佳答案

从我的角度来看,只有选项1真正起作用,并且如果您希望支持跟随1024个以上的用户,则可能需要调整RavenDB与Lucene的对话方式。

选项2和选项3 没有考虑到跟随新用户之后,您希望他们的旧推文出现在时间轴中。同样,您还希望这些推文在您取消关注后从时间轴中消失。如果要使用这两种方法之一来实现此目的,则需要在“关注”操作上复制其所有推文,并在“取消关注”时将其删除。这将使跟踪/取消跟踪操作非常昂贵,并且还可能失败(如果包含此推文部分的服务器在执行此操作时不可用,那该怎么办?)。

选项2 还具有巨大的缺点,即会产生大量的重复数据。想一想拥有数百万关注者和数千条帖子的著名用户。然后将其与成千上万的著名用户相乘...甚至Twitter都无法处理如此大量的数据。

选项3 还存在一个问题,即对索引的查询会变慢,因为每个Lucene文档都将具有可能带有数百万个值的“收件人”字段。而且您有数万亿的文档...不,我不是Lucene专家,但是我认为它不能足够快地显示时间轴(即使忽略了您不是唯一想要显示时间轴的并发用户)。

如上所述,我认为只有选项1有效。也许其他人有更好的方法。顺便问一句。

关于asp.net-mvc - 使用RavenDB的类似Twitter的模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10575731/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com