patterns pattern microsoft csqr nhibernate design-patterns orm command cqrs

nhibernate - microsoft - materialized view pattern



CQRS: el lado de la consulta (5)

Muchos de los artículos de blogsphere relacionados con la separación de CQRS (repsonsibility de consulta de comando) parecen implicar que todas las pantallas / viewmodels son planas. por ejemplo, nombre, edad, ubicación de nacimiento, etc. y, por lo tanto, la sugerencia de que la implementación en cuanto a los datos los incluyamos en una fuente de lectura rápida, etc. tabla única por vista mySQL, etc. y extráigalos con algo como SqlDataReader primitivo, patear ese nhibernate desagradable ORM, etc.

Sin embargo, aunque estoy de acuerdo en que los modelos de dominio no se adaptan bien a la mayoría de las pantallas, muchas de las pantallas con las que trabajo son más dimensionales, y estoy seguro de que esto es bastante común en las aplicaciones LOB.

Así que mi pregunta es cómo es la gente que maneja la pantalla donde, por ejemplo, muestra un resumen de los detalles del cliente y luego una lista de sus pedidos con un enlace [más detallado], etc.

Pensé en mantener la consulta directa de SQL en la base de datos de consultas rompiendo la combinación externa para poder construir un ViewModel adecuado para la vista, pero parece que se trata de un exceso.

Alternativamente (esto empieza a parecer asqueroso) en la tabla CustomerSummaryView tiene una columna text / big (cualquiera que sea el tipo en su base de datos) llamada Orders, y las columnas de la cuadrícula de pantalla Resumen de pedido están separadas por | y filas por |. Incluso con el tipo de datos XML todavía está sucio.

¿Alguna idea sobre una práctica óptima?


Creo que a la gente le falta el sentido de CQS (o CQRS, lo mismo realmente). CQR es simplemente un patrón para decir que debe tener modelos separados para leer y escribir. Lo que ese modelo es depende completamente de sus requisitos de implementación.

La gente que ha estado hablando de esto recientemente generalmente describe arquitecturas extremadamente simples y la implementación para llevar a casa que el hecho de que la mayoría del software empresarial escrito hoy está sobre diseñado y sobre-diseñado.


Sí, hay una confusión que surge. Así es como sucede: primero, para ayudar realmente a las personas nuevas a entender de qué se trata CQRS, y para llegar a la conclusión de cómo difiere de la arquitectura en capas típica, la gente dice cosas como "tus modelos de visualización pueden ser completamente planos", y "Debería tener un modelo de tabla por vista en su base de datos de Query".

Pero eso solo tiene la intención de aclarar el asunto ... no es cierto que solo debe tener un modelo de tabla por vista (aunque en la mayoría de los casos probablemente debería hacerlo). Lo que esas afirmaciones intentan decir es lo siguiente: "Debes liberarte de algunas reglas que has seguido durante mucho tiempo sobre la normalización. Con la arquitectura CQRS, tienes la oportunidad de crear tablas de bases de datos en tu canal de consultas. que están completamente formados de acuerdo a las necesidades de su vista y nada más. Asegúrese de aprovechar al máximo esto. No vaya a la mitad normalizando estas tablas solo porque es lo que está acostumbrado a hacer. En cambio, siga adelante y haga cosas que antes se consideraban impensables, como crear una tabla de base de datos por modelo de vista o hacer que las tablas de su modelo de vista fueran completamente planas ".

Todavía hay casos como el suyo donde el esquema que mejor se adapta a sus necesidades tendría varias tablas. Incluso podrías (Dios no lo quiera) hacer un Join o dos. Está bien, siempre que haya diseñado las tablas de la base de datos para que sirvan a su vista, y no al revés. Pero tenga cuidado, es fácil deslizarse por la pendiente de la normalización y compartir datos entre muchas vistas en la base de datos de Query. No vayas allí ... simplemente no hay razón y esto implica más costo que beneficio. El objetivo principal es este: tu lógica de visualización debería estar muerta, muerta simple. Desea que las reglas inteligentes vivan en el lado del Comando de la casa, y un poco en los Suscriptores que pueblan los datos en el canal de Consulta. Por lo tanto, el código que se lee desde la base de datos de Query y muestra datos en una pantalla debería ser completamente simple (casi tan simple como una "vista pasiva").

Actualización: Como respaldo adicional a la afirmación de que no está "prohibido" realizar algunas uniones, siempre que haya diseñado la forma de la base de datos para servir mejor a la tarea que está logrando, considere OLAP. El esquema en estrella es un ejemplo perfecto de un esquema de base de datos diseñado para admitir lecturas , que encaja perfectamente en el lado de la consulta de CQRS, y que implica uniones. Las uniones se mantienen simples, y están en su lugar para mejorar aún más los objetivos de las tareas de lectura realizadas en la base de datos.


Si desea trabajar con diferentes dimensiones en sus vistas, no hay problemas para hacer eso. No está diciendo que no puedes usar varios modelos de vista debajo de una vista. El desnormalizador es responsable de rellenar las vistas de la base de datos con los datos correctos. Eche un vistazo a this publicación, explica cómo funciona el denormalizador y puede orientarlo en su pregunta.


Uno de los beneficios de un enfoque CQRS ES es que puede diseñar datos de visualización realmente simples (lentos). Como resultado de la secuencia de eventos, puede dar forma a sus datos de lectura de la manera que desee. Por lo tanto, a mucha gente le gusta desnormalizar los datos para que estén optimizados para la lectura. Por supuesto que no tienes que hacerlo. Pero ¿por qué no? Piense en la frecuencia de las lecturas en un LOB típico en comparación con las escrituras.

En caso de que lo encuentre útil y le gustaría ver algunas muestras de código, he escrito una respuesta más detallada en mi blog. Puede encontrar la publicación aquí: http://danielwhittaker.me/2014/10/05/build-master-details-view-using-cqrs-event-sourcing/


si alguien realmente está diciendo que sus modelos de vista deben ser planos, están simplificando demasiado su ejemplo o están hablando un montón de tonterías. los datos jerárquicos no son malos y no deben evitarse en sus viewmodels.

sin embargo, realmente no hay ''mejores prácticas'' para esto. todo es muy subjetivo en la forma de cargar los datos. necesita encontrar una solución que funcione bien para su equipo y sistema actual. y también debe comprender qué otras opciones existen, porque probablemente se encontrará con una situación en la que su solución actual es inadecuada.

Estas son algunas de las formas en que manejo esto, dependiendo de la aplicación en la que estoy trabajando, en C # / .NET:

  • Conjuntos de datos y ADO.NET directo, y unir el conjunto de datos directamente a los controles de la pantalla ** escribir código SQL directo para cargar el conjunto de datos ** usar vistas en la base de datos para cargar el conjunto de datos ** usar procesos almacenados para cargar el conjunto de datos

  • Objetos NHibernate y DTO / Viewmodel ** Por lo general, uso las vistas cuando voy por esta ruta: crearé un conjunto de vistas sobre el esquema de mi dominio, que desnormalizaré los datos en el modelo que necesito y luego usaré NH para cargarlo arriba a través de un segundo conjunto de mapas

  • DTO / Automapper del modelo de dominio ** No me gusta este enfoque a menos que sepa que ya tengo todo lo que tengo cargado desde mi modelo de dominio en la memoria. Usaré una herramienta como Automapper para transferir datos de mi modelo de dominio a un DTO / ViewModel

Estoy seguro de que hay otras opciones, pero estas son las tres que uso más a menudo, en orden de frecuencia con que las uso. todos ellos tienen sus propios costos / beneficios. pero lo importante es comprender que puede y debe recuperar los datos de una manera que le facilite llenar sus pantallas.