С базой данных документов вы должны до некоторой степени дублировать ваши данные. Степень зависит от вашей системы и вариантов использования.
Например, если у нас есть простой блог и пользовательские агрегаты, мы можем настроить их как:
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 в класс Blog со свойствами Id и Name совокупности пользователей, связанной с блогом. Я включил эти поля, так как они являются единственными полями, которые интересует класс Blog, поэтому при отображении блога не требуется знать имя пользователя или пароль пользователя.
Эти вложенные классы будут зависеть от сценариев использования ваших систем, поэтому вы должны тщательно их спроектировать, но общая идея состоит в том, чтобы попытаться спроектировать агрегаты, которые могут быть загружены из базы данных за одно чтение, и они будут содержать все данные, необходимые для отображения или манипулирования ими.
Это приводит к вопросу о том, что происходит при обновлении User.Name.
В большинстве баз данных документов вам нужно будет загрузить все экземпляры Blog, принадлежащие обновленному пользователю, обновить поле Blog.BlogUser.Name и сохранить их обратно в базу данных.
Raven немного отличается, так как он поддерживает набор функций для обновлений, поэтому вы можете запустить одно обновление для RavenDB, которое обновит свойство BlogUser.Name блогов пользователей, не загружая их и не обновляя их по отдельности. .
Код для обновления в 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 использует шаблон «Единица работы», поэтому это должно произойти где-то за пределами этого метода.