2012-12-13 42 views
1

给出一个简单的例子如下,我想要一些关于是否存储为单个文档vs多个文档的指导。RavenDB建模 - 单个文档还是多个文档?

class User 
{ 
    public string Id; 
    public string UserName; 
    public List<Post> Posts; 
} 

class Post 
{ 
    public string Id; 
    public string Content; 
} 

一旦数据被存储,有时我会希望给定用户的所有帖子。有时候我可能想要满足特定条件的多个用户的帖子。

我应该将每个用户存储为文档(嵌入了帖子)吗?还是将用户和帖子存储为单独文档更有意义,并且在我的帖子中有某种标识将其链接回用户?

现在,如果每个用户属于某个组织(在我的应用程序中将有数百个组织),该怎么办?

class Organization 
{ 
     public string Id; 
     public List<User> users; 
} 

我应该用单文档方法吗?在这种情况下,我会为每个组织存储一个巨大的文档,其中将包含嵌入式用户,而嵌入式用户又包含嵌入式帖子?

回答

3

您应该将它们保存为单独的文档。用户,组织和帖子是聚合实体的很好例子,在Raven中,每个聚合通常都是它自己的文档。

只有不是聚合的实体应嵌套在同一个文档中。例如,在Post中你可能有一个List<Comment>。评论和发布都是实体,但只有Post是一个聚合。

而是应该将它们与参考型号:

public class User 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
    public List<string> PostIds { get; set; } 
} 

public class Post 
{ 
    public string Id { get; set; } 
    public string Content { get; set; } 
} 

public class Organization 
{ 
    public string Id { get; set; } 
    public List<string> UserIds { get; set; } 
} 

您可以选择非规范化的一些数据到在适当的引用:

public class UserRef 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
} 

public class Organization 
{ 
    public string Id { get; set; } 
    public List<UserRef> Users { get; set; } 
} 

非规范化的用户名进入组织的文档中有显示组织时无需获取每个用户文档的好处。但是,它有一个缺点,即每次更改用户名时都必须更新组织文档。每次考虑关系时,你应该权衡这个利弊。对所有情况都没有正确的答案。

此外,你应该考虑如何真正使用数据。在实践中,你可能会发现你的Organization类可能根本不需要用户列表。相反,您可以在User类上放置一个字符串OrganizationId属性。这将更容易维护,并且如果您想要组织中的用户列表,则可以使用索引查询该信息。

您应该在有关Document Structure DesignHandling Document Relationships的乌鸦文档中阅读更多信息。