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

标签 asp.net-mvc document ravendb

我正在和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/

相关文章:

javascript - 如何调试嵌入在 View 中的javascript

.net - 如何允许所有用户通过集成身份验证访问网站中的一条路由?

javascript - 检查浏览器是否支持 JavaScript 中的 document.querySelectorAll

c# - RavenDB 嵌入了 Raven Management Studio?

ravendb - Raven.Server.exe 无法授予监听 http 的权限

database - 我如何有效地检查 RavenDB 中文档的存在

asp.net-mvc - URL 中的点会导致 ASP.NET mvc 和 IIS 出现 404

c# - MVC 3 区域路由不起作用

react-native - React-Native 中的 DocumentPicker 无法在 Android 设备上正常工作

javascript获取网页中选定文本的段落