¿Cómo puedo evitar duplicar los datos en una base de datos de documentos como RavendB?

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

  •  24-10-2019
  •  | 
  •  

Pregunta

Dado que las bases de datos de documentos, como RAVENDB, no son relacionales, ¿cómo evita duplicar los datos que múltiples documentos tienen en común? ¿Cómo se mantiene esos datos si está bien duplicarlos?

¿Fue útil?

Solución

Con una base de datos de documentos, debe duplicar sus datos hasta cierto punto. Cuál es ese grado dependerá de su sistema y casos de uso.

Por ejemplo, si tenemos un blog simple y agregados de usuarios, podríamos configurarlos como:

  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; }
     }
  }

En este ejemplo, he anidado una clase de bloguser dentro de la clase de blog con las propiedades de identificación y nombre del agregado del usuario asociado con el blog. He incluido estos campos, ya que son los únicos campos que le interesa la clase de blog, no necesita saber el nombre de usuario o la contraseña de los usuarios cuando se muestra el blog.

Estas clases anidadas dependerán de los casos de uso de sus sistemas, por lo que debe diseñarlas cuidadosamente, pero la idea general es intentar diseñar agregados que se pueden cargar desde la base de datos con una sola lectura y contendrán todos los datos requeridos. para mostrarlos o manipularlos.

Esto lleva a la pregunta de qué sucede cuando el nombre de usuario se actualiza.

Con la mayoría de las bases de datos de documentos, tendría que cargar todas las instancias de Blog que pertenecen al usuario actualizado y actualizar el campo Blog.Bloguser.Name y guardarlas todas a la base de datos.

Raven es ligeramente diferente, ya que admite las funciones establecidas para actualizaciones, por lo que puede ejecutar una sola actualización contra RavendB que se convertirá en Bloguser. Propiedad de nombre de los blogs de los usuarios sin que tenga que cargarlas y actualizarlos todos individualmente.

El código para hacer la actualización dentro de RAVENDB (la forma manual) para todos los blogs sería:

  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()
  }

He agregado a los SaveChanges como ejemplo. El cliente RavendB utiliza el patrón de la unidad de trabajo, por lo que esto realmente debería suceder en algún lugar fuera de este método.

Otros consejos

No hay una respuesta "correcta" a su pregunta en mi humilde opinión. Realmente depende de qué tan mutables sean los datos que están duplicando.

Echa un vistazo al Documentación de Ravendb Para obtener muchas respuestas sobre Document DB Design vs. Relacional, pero consulte específicamente la sección "Gestión de asociaciones" del Consideraciones de diseño de estructura de documentos documento. En resumen, el documento DBS usa los conceptos de referencia por IDS cuando no quieren incrustar los datos compartidos en un documento. Estas ID no son como FKS, están a la altura de la aplicación para garantizar la integridad y la resolución.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top