2008-11-06 10 views
5

Quiero trabajar con las asociaciones de ActiveRecord versionadas. P. ej., quiero encontrar el objeto que pertenece a otro objeto_ a partir de una cierta fecha pasada, o al que pertenecía antes de eso. ¿Ya existe una biblioteca subclasificando ActiveRecord de Rails para proporcionar relaciones versionadas? ¿O alguna otra biblioteca de Ruby que proporciona relaciones versionadas persistentes?¿Cómo lograr asociaciones con ActiveRecord versionadas?

Respuesta

1

Apoyando estado histórico en una aplicación transaccional es una buena manera de ampliar enormemente la complejidad, el rendimiento DB lento y hacer la vida más difícil para usted mismo. Si sólo necesita para mostrar o informar sobre el estado histórico y no lo necesita hasta el minuto considerar la construcción de un esquema de estrella con Type-II slowly changing dimensions y un proceso periódico que lo actualiza.

Este será sustancialmente menos compleja que la construcción de una aplicación con sistémica seguimiento del historial ad-hoc corriendo a través de la base de código. Si este enfoque hará lo que necesita de la aplicación, probablemente será mejor que lo haga. También significa que la base de datos de la aplicación funcionará muy bien con los mecanismos de acceso a la base de datos de vanilla que vienen con el sistema.

Si necesita actualización frecuente razonablemente se puede implementar un sistema de captura de datos-cambiado en la base de datos, que es relativamente simple si la aplicación sólo tiene que preocuparse por el estado actual. Con un mecanismo de CDC, el proceso de carga solo tiene que actualizarse en función de los cambios y se ejecutará con relativa rapidez.

2

Siempre y cuando no se está tratando con enormes cantidades de datos, y la dimensión extra temporal no empujará su base de datos sobre el borde, no hay mayores inconvenientes a los datos versionados históricamente. La complejidad de la consulta adicional puede ser un poco dolorosa, pero no es nada importante.

En mi caso escribí un plugin de rieles que se encarga de versiones, se añade 5 columnas para cada tabla versionado (y ayuda a manejar la consulta/manipulación, etc.):

VALID_FROM - fecha y hora - la fecha y hora que esta versión era creado el

valid_to - fecha y hora - la fecha y hora que esta versión ha dejado de ser válida

id_raíz - entero - el identificador del original fila (que se trata de una versión posterior de)

created_by - número entero - El ID de usuario del usuario que realizó la creación de esta versión

retired_by - número entero - El identificador de usuario del usuario que retirado esta versión

Para las filas actualmente activos, valid_to es nulo. Agregar un índice en valid_to aids para mantener el rendimiento ágil.

+0

en desacuerdo con 'ligera'. En un sistema de suscripción de seguros estoy algo familiarizado con las estimaciones de que el seguimiento del historial agregado en una versión particular representa alrededor del 70% del esfuerzo de desarrollo. – ConcernedOfTunbridgeWells

+0

Interesante, mi experiencia personal se desvía un poco, pero diseñé el sistema para ser versionado desde cero. Prefiero no imaginar el dolor que me llevaría agregarlo en una versión posterior. El sistema tenía aproximadamente 20 tablas versionadas, 10 sin versión. – Michael

+1

¡Hm, esto suena muy interesante! ¿Liberaste tu complemento en alguna parte?¿Podrías subirlo a github? Me encantaría verlo para obtener algunas ideas, etc. – reto

Cuestiones relacionadas