鉴于该文档数据库(例如Ravendb)是非关系的,您如何避免复制多个文档具有共同的数据?如果可以复制它,该如何维护该数据?

有帮助吗?

解决方案

使用文档数据库,您必须在一定程度上复制数据。该程度取决于您的系统和用例。

例如,如果我们有一个简单的博客和用户汇总,我们可以将它们设置为:

  public class User 
  {
    public string Id { get; set; }
    public string Name  { get; set; }
    public string Username  { get; set; }
    public string Password  { get; set; }
  }

  public class Blog
  {
     public string Id  { get; set; }
     public string Title  { get; set; }

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

在此示例中,我在博客类中嵌套了一个Bloguser类,并具有与博客关联的用户汇总的ID和名称属性。我包括这些字段,因为它们是博客类感兴趣的唯一字段,在显示博客时,它不需要知道用户用户名或密码。

这些嵌套类将取决于您的系统用例,因此您必须仔细设计它们,但是总体想法是尝试设计可以使用单个读取的数据库加载的聚合物,它们将包含所需的所有数据显示或操纵它们。

然后,这导致了一个问题,即用户名更新时会发生什么。

使用大多数文档数据库,您必须加载属于更新的用户的博客的所有实例并更新blog.bloguser.name字段,然后将它们全部保存回数据库。

Raven略有不同,因为IT支持设置功能以用于更新,因此您可以对Ravendb进行一次更新,该更新将与Bloguser。用户博客的名称属性无需加载它们并单独更新它们。

在Ravendb(手册方式)中进行更新的代码,所有博客的代码都是:

  public void UpdateBlogUser(User user)
  {
    var blogs = session.Query<Blog>("blogsByUserId")
                  .Where(b.BlogUser.Id == user.Id)
                  .ToList();

    foreach(var blog in blogs)
       blog.BlogUser.Name == user.Name;

    session.SaveChanges()
  }

我在Savechanges中添加了一个例子。 Ravendb客户端使用工作模式单位,因此这应该确实发生在此方法之外的某个地方。

其他提示

恕我直言,没有人对您的问题有“正确的”答案。这确实取决于您重复的数据的可变程度。

看一下 Ravendb文档 有关文档DB设计与关系的许多答案,但专门查看了“关联管理”部分 文档结构设计注意事项 文档。简而言之,文档DBS不想在文档中嵌入共享数据时使用ID的参考概念。这些ID不像FKS,它们完全取决于应用程序以确保和解决的完整性。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top