2010-06-03 35 views

Respuesta

12

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

Por ejemplo si tenemos un simple agregados de blogs y de usuario podríamos instalarlas 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 BlogUser dentro de la clase Blog con las propiedades ID y nombre de la Agregado de usuario asociado al blog. He incluido estos campos, ya que son los únicos campos que le interesan a la clase Blog, no es necesario que conozca 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 su sistema, por lo que debe diseñarlas cuidadosamente, pero la idea general es intentar diseñar Agregados que se puedan cargar desde la base de datos con una sola lectura y contendrán todos los datos requeridos para mostrarlos o manipularlos.

Esto nos lleva a la pregunta de qué sucede cuando se actualiza User.Name.

Con la mayoría de las bases de datos de documentos, deberá cargar todas las instancias de Blog que pertenecen al Usuario actualizado y actualizar el campo Blog.BlogUser.Name y guardarlas nuevamente en la base de datos.

Raven es ligeramente diferente, ya que admite funciones de configuración para las actualizaciones, por lo que puede ejecutar una única actualización contra RavenDB que actualizará la propiedad BlogUser.Name de los blogs de los usuarios sin tener que cargarlos y actualizarlos todos individualmente.

El código para hacer la actualización dentro de RavenDB (la forma manual) para todo el blog sería de:

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 añadido en los SaveChanges sólo como un ejemplo. El Cliente RavenDB utiliza el patrón de Unidad de trabajo y, por lo tanto, esto debería suceder en algún lugar fuera de este método.

+0

De hecho, es compatible con funciones de conjunto, para actualizar de todos modos –

+0

Entonces, ¿es seguro decir que debe replicar los datos que de otro modo necesitaría recuperar de otro documento y usar las funciones establecidas para actualizar/mantener los datos duplicados? ¿Cómo se vería esa actualización (la respuesta sería mucho mejor). ¡Gracias! –

+0

@Jon He agregado un ejemplo de hacer esto a lo largo del camino, todavía no he investigado las operaciones de Ravens. Lo investigaré y agregaré un ejemplo. –

2

No hay una respuesta "correcta" a su pregunta en mi humilde opinión. Realmente depende de cuán mutable sea la información que está duplicando.

Eche un vistazo a RavenDB documentation para obtener una gran cantidad de respuestas sobre el diseño de base de datos de documento vs. relacional, pero específicamente consulte la sección "Gestión de asociaciones" del documento Document Structure Design Considerations. En resumen, los DB de documentos utilizan los conceptos de referencia por ID cuando no desean incrustar datos compartidos en un documento. Estas identificaciones no son como FK, están totalmente a la altura de la aplicación para garantizar la integridad y la resolución.

Cuestiones relacionadas