Как я могу постараться не копировать данные в документной базе данных как RavenDB?

Учитывая, что документные базы данных, такие как RavenDB, являются нереляционными, как Вы стараетесь не копировать данные, которые имеют общего несколько документов? Как Вы поддерживаете, что данные, если они должны хорошо копировать его?

6
задан John Nelson 3 June 2010 в 17:09
поделиться

2 ответа

В базе данных документов вы должны до некоторой степени дублировать свои данные. То, что это за степень, будет зависеть от вашей системы и вариантов использования.

Например, если у нас есть простой блог и пользовательские агрегаты, мы могли бы настроить их как:

  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, ему не нужно знать имя пользователя или пароль при отображении блога.

Эти вложенные классы будут зависеть от сценариев использования вашей системы, поэтому вы должны тщательно их проектировать, но общая идея состоит в том, чтобы попытаться разработать агрегаты, которые могут быть загружены из базы данных за одно чтение, и они будут содержать все данные, необходимые для отображения или управления ими.

Это приводит к вопросу о том, что происходит, когда Пользователь.Имя обновляется.

В большинстве баз данных документов вам придется загрузить все экземпляры блога, принадлежащие обновленному пользователю, обновить поле 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 использует шаблон «Единица работы», поэтому это действительно должно происходить где-то за пределами этого метода.

12
ответ дан 8 December 2019 в 17:18
поделиться

ИМХО, "правильного" ответа на ваш вопрос нет. Это действительно зависит от того, насколько изменчивы данные, которые вы дублируете.

Взгляните на документацию RavenDB , чтобы получить множество ответов о дизайне БД документа и реляционном дизайне, но особенно посмотрите раздел «Управление ассоциациями» Рекомендации по проектированию структуры документа документ. Короче говоря, базы данных документов используют концепцию ссылки по идентификаторам, когда они не хотят встраивать общие данные в документ. Эти идентификаторы не похожи на FK, они полностью зависят от приложения для обеспечения целостности и разрешения.

2
ответ дан 8 December 2019 в 17:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: