studio reales proyectos programacion libro introducción incluye herramientas fundamentos fuente español código con avanzado aplicaciones database database-design refactoring workflow

database - reales - libro de android studio en español pdf



Mejores prácticas: almacenar un estado de flujo de trabajo de un elemento en una base de datos? (6)

Tengo una pregunta sobre las mejores prácticas con respecto a cómo se debe abordar el almacenamiento de estados complejos de flujo de trabajo para procesar tareas en una base de datos. He estado buscando en línea en vano, así que pensé en preguntarle a la comunidad qué pensaban que era mejor.

Esta pregunta proviene del mismo ejemplo de "BoxItem" que di en una pregunta anterior. Este "BoxItem" está siendo rastreado en mi sistema a medida que se realizan varias tareas en él. La tarea puede tener lugar durante varios días y con interacción humana, por lo que el estado de BoxItem debe persistir. Quién realizó la tarea (si corresponde) y cuándo se realizó la tarea también debe ser rastreado.

Al principio, me acerqué a esto añadiendo tres campos a la tabla "BoxItems" para cada tarea interactiva con los humanos que tenía que hacerse:

¿ TaskName está completo?

Fecha TaskName Complete

Usuario TaskName Complete

Esto funcionó cuando el flujo de trabajo era simple ... pero ahora ha crecido a un proceso complejo (> 10 posibles interacciones humanas en el flujo ... aproximadamente la mitad de las cuales son opcionales, y pueden o no hacerse para el BoxItem, lo que resultó en que comencé a agregar campos "Do TaskName " también para esas tareas opcionales), descubrí que lo que debería haber sido una tabla simple ahora tiene 40 campos dedicados por completo a la retención de esta información de estado.

Me pregunto si no hay una mejor manera de hacerlo ... pero estoy perdido.

Lo primero que pensé fue crear una tabla genérica de "BoxItemTasks" que definiera las tareas que se pueden hacer en un cuadro dado, pero igual tendría que guardar la información de fecha y de usuario individualmente, por lo que realmente no me ayudó.

Mi segundo pensamiento fue que tal vez no importara, y no debería preocuparme si esta tabla tiene 40 o más campos dedicados a la retención del estado ... y tal vez solo estoy siendo paranoico. Pero parece que hay mucha información para retener.

De todos modos, estoy perdido en cuanto a lo que podría ser una tercera opción, o si una de las dos opciones anteriores es realmente razonable. Veo que este flujo de trabajo puede volverse aún más complejo en el futuro, y para cada nueva tarea voy a necesitar agregar 3 o 4 campos solo para respaldar su seguimiento ... se siente como si estuviera fuera de control.

¿Qué haría usted en esta situación?

Debo señalar que este es el mantenimiento de un sistema existente, que se construyó sin un ORM, por lo que no puedo dejar que el ORM se encargue de él.

EDITAR:

Kev, ¿estás hablando de hacer algo como esto?

BoxItems

(PK) BoxItemID

(Otras cosas irrelevantes)

BoxItemActions

(PK) BoxItemID

(PK) BoxItemTaskID

Esta completado

DateCompleted

UsuarioCompletado

BoxItemTasks

(PK) TaskType

Descripción (si es necesario)

Hmm ... eso funcionaría ... representaría una necesidad de cambiar la forma en que actualmente me acerco a hacer Consultas SQL para ver qué elementos están en qué estado, pero a largo plazo algo como esto parece funcionar mejor (sin tener hacer que un diseño fundamental cambie como lo representa la idea de serialización ... aunque si tuviera tiempo, me gustaría hacerlo de esa manera, creo).

Entonces, ¿es esto lo que mencionaste Kin, o estoy fuera?

EDITAR: Ah, veo tu idea también con la "Última Acción" para determinar el estado actual ... ¡Me gusta! Creo que eso podría funcionar para mí ... Tendría que cambiarlo un poco (porque en algún momento las tareas suceden al mismo tiempo), ¡pero la idea parece buena!

EDITAR FINAL: En resumen, si alguien más está buscando esto en el futuro con la misma pregunta ... parece que el enfoque de serialización sería útil si su sistema tiene la información precargada en alguna interfaz donde es cuestionable (es decir, no llamar directamente a la base de datos, como lo hace el sistema ad-hoc en el que estoy trabajando), pero si no lo tienes, la idea de tablas adicionales parece que debería funcionar bien. ¡Gracias a todos por sus respuestas!


Como sugirió la respuesta anterior, dividiría su mesa en varias.

BoxItemActions, que contiene una lista de acciones por las que debe pasar el flujo de trabajo, creada cada vez que se crea un elemento de cuadro. En esta tabla, puede rastrear las fechas detalladas / times / users de cuando se completó cada tarea.

Con este tipo de aplicación, saber dónde irá la Caja puede ser bastante complicado, por lo que tener un ''Mapa'' de los pasos restantes para la Caja será bastante útil. Además, esta tabla puede agruparse como loca, cientos de filas por caja, y aún será muy fácil consultarla.

También hace posible tener ''diferentes caminos'' que puedan cambiarse fácilmente. Una tabla de datos maestros de ''rutas'' a través del flujo de trabajo es una solución, donde a medida que se crea cada cuadro, el usuario debe seleccionar qué ''ruta'' seguirá el cuadro. O puede configurar para que cuando el usuario cree el cuadro, seleccionen tareas requeridas para este cuadro en particular. Depende de nuestro problema comercial.


Creo que serializaría el objeto Workflow en XML y lo almacenaría en la base de datos con una columna ID. Puede ser más difícil informar, pero parece que puede funcionar en su caso.



Por lo que vale, en BizTalk "deshidratan" los patrones de mensajes de larga duración (flujos de trabajo y similares) mediante una serialización binaria en la base de datos.


Si estoy entendiendo correctamente, agregaría la tabla BoxItemTasks (solo una tabla de enumeración, ¿no?), Luego una tabla BoxItemActions con claves foráneas para BoxItems y BoxItemTasks para qué tipo de tarea es. Si desea hacer que una tarea en particular solo se pueda realizar una vez en un elemento de cuadro particular, simplemente haga que el par de columnas (Artículos + Tareas) sea la clave principal de BoxItemActions.

(Lo dijiste mucho mejor que yo, y felicitaciones por interpretar correctamente lo que estaba diciendo. Lo que escribiste es exactamente lo que estaba imaginando).

En cuanto a determinar el estado actual, puede escribir un disparador en BoxItemActions que actualice una sola columna BoxItems.LastAction. Para acciones simultáneas, su desencadenante podría tener casos especiales para decidir qué acción requiere recencia.


¿Qué tal un híbrido de la serialización y los modelos de la base de datos? Tenga un documento XML que sirva como documento maestro de flujo de trabajo, que contenga un nodo para cada paso con atributos y elementos que detallen su nombre, orden en el proceso, condiciones para si es opcional o no, etc. Lo más importante es que cada nodo de paso puede tener un ID de paso único

Luego, en su base de datos, tiene una estructura simple de dos tablas. La tabla BoxItems almacena sus datos básicos de BoxItem. Luego, una tabla BoxItemActions se parece mucho a la solución que marcó como respuesta.

Es esencialmente similar a la solución aceptada como respuesta, pero en lugar de una tabla BoxItemTasks para almacenar la lista maestra de tareas, utiliza un documento XML que permite cierta flexibilidad para la definición del flujo de trabajo real.