Pregunta

Estoy trabajando en un proyecto en el que vamos a necesitar para determinar ciertos tipos de estados para un gran grupo de personas, almacenada en una base de datos. Las reglas de negocio para determinar estos estados son bastante complejas y pueden cambiar.

Por ejemplo,

if a person is part of group X 
and (if they have attribute O) has either attribute P or attribute Q, 
or (if they don't have attribute O) has attribute P but not Q,
and don't have attribute R, 
and aren't part of group Y (unless they also are part of group Z), 
then status A is true. 

Multiplicar por varias docenas de estados y posiblemente cientos de grupos y atributos. Las personas, los grupos y atributos están en la base de datos.

A pesar de esto va a ser consumido por una aplicación Java, también queremos ser capaz de ejecutar informes directamente contra la base de datos, por lo que sería mejor si el conjunto de estados calculados estaban disponibles en el nivel de datos.

Nuestro plan de diseño actual, entonces, es tener una tabla o vista que consiste en un conjunto de indicadores booleanos (hasStatusA? HasStatusB? HasStatusC?) Para cada persona. De esta manera, si quiero consulta para todo aquel que tiene la condición de C, que no tiene que saber todas las reglas para el cálculo de estado C; Acabo de comprobar la bandera.

(Tenga en cuenta que, en la vida real, las banderas tendrán nombres más significativos:. IsEligibleForReview ?, isPastDueForReview ?, etc.).

Así que a) se trata de un enfoque razonable, y b) en caso afirmativo, ¿cuál es la mejor manera de calcular esas banderas?

Algunas opciones que estamos considerando para el cálculo de las banderas:

  1. Hacer que el conjunto de indicadores a fin, y calcular los valores de los indicadores a partir de los datos subyacentes en tiempo real utilizando SQL o PL-SQL (esto es una base de datos Oracle). De esta manera los valores son siempre exactas, pero el rendimiento puede sufrir, y las reglas tendría que ser mantenida por un desarrollador.

  2. Hacer que el conjunto de banderas consisten en datos estáticos, y el uso de algún tipo de motor de reglas para mantener esas banderas hasta a la fecha que los cambios en los datos subyacentes. De esta manera las reglas se puede mantener más fácilmente, pero las banderas potencialmente podría ser inexacta en un punto dado en el tiempo. (Si vamos con este enfoque, no es un motor de reglas que se pueden manipular fácilmente los datos dentro de una base de datos de esta manera?)

¿Fue útil?

Solución

En un caso como este sugieren que la aplicación de Ward Cunningham de pregunta-preguntarse "¿Cuál es la cosa más simple que podría posiblemente trabajo?".

En este caso, lo más sencillo podría ser para llegar a una visión que mira a los datos, ya que existe y hace los cálculos y cómputos para producir todos los campos que le interesan. Ahora, cargar su base de datos y probarlo. ¿Es lo suficientemente rápido? Si es así, bueno - que hizo lo más simple posible y funcionó bien. Si no es lo suficientemente rápido, buena - el primer intento no funcionó, pero tienes las reglas trazadas en el código de la vista. Ahora puede ir a probar la próxima versión de "la cosa más simple" - tal vez su escritura una tarea de fondo que los relojes de los aislantes y las actualizaciones y luego salta a recalcular las banderas. Si funciona, fino y elegante. Si no, vaya a la siguiente iteración ... y así sucesivamente.

Compartir y disfrutar.

Otros consejos

Yo aconsejaría en contra de hacer los estados como nombres de columna, sino más bien utilizar un ID de estado y valor. tales como una tabla de estado del cliente con columnas de ID y valor.

Yo tendría dos métodos para los estados de actualización. Uno un procedimiento almacenado que, o bien tiene toda la lógica o llamadas separadas almacenados procs de averiguar el estado de cada. usted podría hacer toda esta dinámica por tener una función para cada evaluación del estado, y el proc almacenado entonces podría llamar a cada función. El segundo método sería tener proc sea cual sea almacenada (s), esa información actualizaciones usuario, llame a un procedimiento almacenado para ir de actualización de todos los estados de los usuarios en base a los datos actuales. Estos dos métodos se permitirá tener dos actualizaciones en tiempo real de los datos que han cambiado y si se agrega un nuevo estado, puede llamar al método para actualizar todos los estados con la nueva lógica.

Esperamos que tengan un punto de cambios a los datos del usuario, tales como un procedimiento almacenado de actualización del usuario, y se puede poner la actualización de estado de la llamada procedimiento almacenado en dicho procedimiento. Esto haría también ahorran tener que programar una tarea cada n segundos a estados de actualización.

Una opción que consideraría sería que cada bandera para ser respaldado por una función determinista que devuelve el valor hasta a la fecha indicada los datos pertinentes.

La función no podría llevar a cabo lo suficientemente bien, sin embargo, si hace una llamada por muchas filas a la vez (por ejemplo, para la presentación de informes). Por lo tanto, si estás en Oracle 11g, puede resolver esto mediante la adición columnas virtuales (búsqueda de "columna virtual") a las tablas correspondientes en base a la función. El Resultado función de caché debería mejorar la el desempeño de la función también.

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