1

给定一个如下的简单示例,我想要一些关于是否存储为单个文档与多个文档的指导。

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

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

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

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

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

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

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

4

1 回答 1

3

您应该将它们作为单独的文件保存。User、Organization 和 Post 是聚合实体的绝佳示例,在 Raven 中,每个聚合通常是它自己的文档。

只有不是聚合的实体才应该嵌套在同一个文档中。例如,在 Post 中,您可能有一个List<Comment>. Comment 和 Post 都是实体,但只有 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班级可能根本不需要用户列表。相反,您可以在类上放置一个字符串OrganizationId属性。User这将更容易维护,如果您想要组织中的用户列表,您可以使用索引查询该信息。

您应该阅读更多关于文档结构设计处理文档关系的 raven 文档。

于 2012-12-13T15:18:03.537 回答