Как я могу избежать дублирования данных в базе данных документов, таких как Ravendb?

StackOverflow https://stackoverflow.com/questions/2968193

  •  24-10-2019
  •  | 
  •  

Вопрос

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

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

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

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

Другие советы

Там нет никого «правильного» ответа на ваш вопрос IMHO. Это действительно зависит от того, насколько изменчивы данные, которые вы дублируете.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top