像Facebook这样的C#mongodb模式

像Facebook这样的C#mongodb模式,c#,data-modeling,mongodb-.net-driver,C#,Data Modeling,Mongodb .net Driver,我正在做一个项目,MongoDB模式将类似于Facebook。所以我们都知道FB是如何工作的,一个用户“喜欢”一个乐队/公司页面,并且该用户将看到该页面上的所有帖子 下面的模型是我应该如何设计的? 如果一个页面有一百万个Like,那么每个帖子将有一百万个Like的子文档。这似乎不对,一定有更好的办法,我想不出来 谢谢 public class Person { public ObjectId Id { get; set; } public string FirstName { g

我正在做一个项目,MongoDB模式将类似于Facebook。所以我们都知道FB是如何工作的,一个用户“喜欢”一个乐队/公司页面,并且该用户将看到该页面上的所有帖子

下面的模型是我应该如何设计的? 如果一个页面有一百万个Like,那么每个帖子将有一百万个Like的子文档。这似乎不对,一定有更好的办法,我想不出来

谢谢

public class Person
{
    public ObjectId Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class Page
{
    public ObjectId Id { get; set; }
    public string Name { get; set; }
    public List<Like> PersonLikes { get; set; }

}
public class Like
{
    public ObjectId Id { get; set; }
    public ObjectId UserId { get; set; }
    public DateTime DateLiked { get; set; }
}

public class Post
{
    public ObjectId Id { get; set; }
    public ObjectId PageId { get; set; }
    public string Message { get; set; }
    public List<Like> PersonLikes { get; set; }
}
公共类人物
{
公共对象Id{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
}
公共类页面
{
公共对象Id{get;set;}
公共字符串名称{get;set;}
公共列表PersonLikes{get;set;}
}
公共类
{
公共对象Id{get;set;}
public ObjectId UserId{get;set;}
公共日期时间日期{get;set;}
}
公营职位
{
公共对象Id{get;set;}
public ObjectId PageId{get;set;}
公共字符串消息{get;set;}
公共列表PersonLikes{get;set;}
}

假设您只想跟踪喜欢的内容,我会采取行动

public class Page
{
    public ObjectId Id { get; set; }
    public DateTimeOffset Date { get; set; }
    public string Name { get; set; }
    public int NumberOfLikes { get; set; }
}

public class Post
{
    public ObjectId Id { get; set; }
    public ObjectId PageId { get; set; }
    public DateTimeOffset Date { get; set; }
    public string Message { get; set; }
    public int NumberOfLikes { get; set; }
}
然后我会将反应(喜欢或不喜欢)排成队列,以便插入,“情绪”信息不必实时存储,对吗?这些不是药物、银行交易等

public class Like
{
    public ObjectId Id { get; set; }
    public ObjectId ParentId { get; set;}
    public ObjectId UserId { get; set; }
    public DateTimeOffset Date { get; set; }
}
在哪里排队?收集喜欢的东西。为什么不是页面或帖子的一部分?因为如果一篇帖子像病毒一样传播(正如你所说,即使大多数人不会),你可能会得到1000000个喜欢。除了分析引擎,谁将浏览这些信息


您还必须确保用户只能对每个项目表达一次他们的反应。

帖子只存在于一个页面上,因此应该是页面拥有帖子,而不是拥有页面的帖子

public class Person
{
    public ObjectId Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class Page
{
    public ObjectId Id { get; set; }
    public string Name { get; set; }
    public List<Like> PersonLikes { get; set; }
    public List<Post> Posts { get; set; }
}

public class Post
{
    public ObjectId Id { get; set; }
    public string Message { get; set; }
    public List<Like> Likes { get; set; }
}

public class Like
{
    public ObjectId Id { get; set; }
    public ObjectId UserId { get; set; }
    public DateTime DateLiked { get; set; }
}
公共类人物
{
公共对象Id{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
}
公共类页面
{
公共对象Id{get;set;}
公共字符串名称{get;set;}
公共列表PersonLikes{get;set;}
公共列表发布{get;set;}
}
公营职位
{
公共对象Id{get;set;}
公共字符串消息{get;set;}
公共列表类似于{get;set;}
}
公共类
{
公共对象Id{get;set;}
public ObjectId UserId{get;set;}
公共日期时间日期{get;set;}
}

有人有什么建议吗?考虑到事情可能会传播开来,这个问题问得不错。我可能会有一个like计数器,然后有另一个集合,其中存储了实际的like信息。它们会不同步吗?当然,没有交易,但你需要准确吗?>这似乎不对,一定有更好的方式,我想不出。首先,是的,这是不对的。MongoDB绝对不是这个解决方案的数据库,您最好使用SQL数据库来实现这个模式。这个解决方案的完美数据库是像Neo4JT这样的图形数据库在StackOverflow上有几个类似的问题,例如,另请参阅MongoDB文档,其中有大量关于数据模型的注释:您的
Like
类缺少所喜欢的页面或帖子的Id。@IanMercer还将DateTime更改为DateTimeOffset。感谢您的回复。每个帖子都不需要被喜欢。我只需要一个用户来查看帖子。因此,在上面的示例中,我如何通过用户名“XXXXX”查询Like集合以查看所有的帖子?@Curtis注意,我建议使用PostMountains和PageMountains集合,这两个集合都具有用户名以及通过ParentId对应的页面或帖子。对不起,我不知道您所说的PostMountains和PageMountains是什么意思。