2012-07-27 15 views
6

Tengo una gran cantidad de datos existentes en mi base de datos, y quiero desarrollar un mecanismo de puntos que calcule una puntuación para cada usuario en función de las acciones que realice.Diseñando un sistema de puntos en Spring

Implemento esta funcionalidad de forma conectable, de modo que sea independiente de la lógica principal y confíe en los eventos de primavera que se envían, una vez que se modifica una entidad.

El problema es qué hacer con los datos existentes. No quiero comenzar a acumular puntos a partir de ahora, sino más bien incluir todos los datos hasta ahora.

¿Cuál es la forma más práctica de hacer esto? ¿Debo diseñar mis complementos de manera que proporcionen un método de índice(), que forzará a mi sistema a buscar cada entidad de la base de datos, enviar un EntityDirtyEvent, activar los complementos de puntos para cada uno y luego actualizar esto, para permitir que los puntos se guarden al lado de cada entidad. Eso podría generar muchos gastos generales, ¿verdad?

Lo más simple sería crear un procedimiento almacenado complejo, y luego hacer que el índice() llame a ese procedimiento almacenado. Sin embargo, eso me parece algo malo también. Como tendré que escribir la lógica para calcular los puntos en Java de todos modos, ¿por qué volver a SQL? Además, en general, no soy partidario de dividir la lógica empresarial en las diferentes capas.

¿Alguien ha hecho esto antes? Por favor ayuda.

Respuesta

4

Primero, distingamos entre la estrategia de implementación y las reglas comerciales.

Como ya tiene los datos, considere obtener resultados directamente de los datos. Esto forma el modelo de dominio de datos. Diseña el modelo de datos para almacenar todos tus datos. Luego, cree un conjunto de consultas, vistas y procedimientos almacenados para acceder y actualizar los datos.

Una vez que tenga esas vistas, use una biblioteca de acceso a datos como Spring JDBC Template para buscar estos datos y representarlos en objetos java (listas, mapas, personas, tablas de puntos, etc.).

Lo que ha completado hasta ahora no cambia mucho, independientemente de lo que sucede en las capas superiores del sistema. Esto se llama Modelo.

Luego, desarrolle una base de reglas o implementación lógica que determine, bajo qué entradas, acciones del usuario, condiciones de datos o para todas las demás condiciones, qué datos se necesitan. En sentido matematico, esto es como una matriz. En sentido de programación, esto sería un conjunto de enunciados lógicos. Si esto y esto y esto es cierto, obtenga estos datos, de lo contrario, obtenga esos datos, etc. Esto abarca la lógica de su sistema. Por lo tanto, se llama "Controlador".

No mueva esta lógica a las consultas/procedimientos almacenados/vistas.

Luego, finalmente, desarrolle un front-end o "consola" para esto. En el caso más simple, desarrolle un sistema de entrada de consola, que toma una ... y muestra un conjunto de resultados. Esta es su "vista" del sistema.

Con el tiempo puede desarrollar la vista en una aplicación web. La vista de línea de comandos anterior aún puede ser viable en la forma de un servidor API Restful.

2

Creo que hay un problema aquí para tener en cuenta: como entiendo hay enormes datos en la base de datos, la idea de crear solo un mecanismo para calcular el sistema de puntos no podría ser el mejor enfoque.

De hecho, si no quiere comenzar a acumular puntos pero incluye todos los datos, debe procesar y calcular la información que tiene ahora. Sí, la primera vez que ejecute esto puede generar una sobrecarga, pero como dijo, necesita calcular estos datos.

Por otra parte, puede incluir otro mecanismo que asista a cambios en una entidad y ejecute un proceso diferente capaz de calcular la nueva difrencia de señalar que se aplica a esta modificación en particular.

Por lo tanto, puede utilizar un servicio responsable de calcular el sistema de señalamiento, uno para una sola entidad y otro, puede ser más largo para terminar, capaz de calcular los puntos globales. Incluso, si no necesita calcularse en tiempo real, puede crear un trabajo programado responsable de iniciarlo.

Finalmente, sé que no es un buen enfoque dividir la lógica empresarial en dos capas (Db + Java) pero a veces es un requisito hacerlo, por ejemplo, si necesita responder rápidamente a una solicitud que finalmente funciona con muchos registros He encontrado algunos casos en los que no hay otra opción que agregar lógica comercial a la base de datos (como procedimientos almacenados, etc.) para administrar una gran cantidad de datos y devolver el resultado final al cliente del navegador (por ejemplo, proceso de cálculo en un momento específico)

2

Estás tratando de lograr el "arranque". El enfoque que elijas dependerá de lo complicado que sean los cálculos de los puntos. Si los procedimientos almacenados o las declaraciones de actualización simple son la solución más simple, hazlo.

Si los cálculos son complicados, escriba un trabajo por lotes que cargue los datos existentes, probablemente los ordene primero y dispare los eventos correspondientes a esos datos como si acabaran de ocurrir. El código que trata con un evento debe ser exactamente el mismo código que se ocupará de un evento futuro, por lo que no tendrá que escribir ningún código adicional aparte de los trabajos por lotes.

Ya que solo ejecutará esto una vez, vaya con la solución más simple, incluso si es rápida y sucia.

2

Parece que va en la dirección correcta. Sabes que quieres que tus "puntos" se desacoplen de la aplicación principal. Como está implícito que ya está utilizando hibernate (¡mediante la etiqueta!), Puede acceder al sistema de eventos de hibernación (consulte here sección 14.2). Dependiendo del tamaño/complejidad de su sistema, puede agregar aquí sus cálculos de puntos (si no es un sistema grande/complejo), o puede publicar su propio evento para que lo recoja el software que esté escuchando.

El punto en cualquier enfoque de diseño es que ni conoce ni se preocupa por los cálculos de sus puntos. Si estás, como supongo, tratando de crear un mecanismo de complemento de propósito bastante general, entonces publicas tus propios eventos en ese sistema desde este punto de conexión. Entonces, si no tiene complementos en una instalación/instalación determinada, entonces nadie obtiene/procesa los eventos. Si tiene varios complementos en otra instalación/instalación, cada uno de ellos puede decidir qué procesamiento deben hacer según el evento recibido. En el caso del "plugin de puntos", calcularía su valor de punto y lo almacenaría. No se requiere ningún procedimiento almacenado ....

1

Hay dos formas diferentes. Una es que ya lo sabe: sondear la base de datos para buscar datos modificados. En ese caso, está accediendo a la base de datos cuando puede no haber cambios y puede ralentizar su proceso.

Segundo enfoque: cada vez que se produce un cambio en la base de datos, la base de datos desencadena el evento. Que puede usar CDC (Change Data Capture). Minimizará la sobrecarga.

Puede buscar más opciones en Spring Integration

Cuestiones relacionadas