Pregunta

Tengo un proyecto que involucra un sistema de votación web.Los valores actuales y los datos relacionados se almacenan en varias tablas.Los datos históricos serán un aspecto importante de este proyecto, por lo que también creé tablas de auditoría a las que se trasladarán los datos actuales de forma regular.

Encuentro esta estrategia altamente ineficiente.Incluso si solo archive datos diariamente, la cantidad de filas será enorme incluso si solo 1 o 2 usuarios realizan actualizaciones en un día determinado.

La siguiente alternativa que se me ocurre es almacenar sólo las entradas que han cambiado.Esto significará tener que crear una lógica para crear automáticamente una vista de un día determinado.Esto significa menos filas almacenadas, pero una complejidad considerable.

Mi idea final es un poco menos convencional.Dado que los datos históricos serán para fines de generación de informes, no es necesario que los usuarios de la web tengan acceso rápido.Estoy pensando que mi base de datos podría no contener datos históricos.DB solo representa el estado actual.Luego, diariamente, se podría cargar toda la base de datos en objetos (la cantidad de usuarios/datos es relativamente baja) y luego serializarla en algo como XML o JSON.Estos archivos podrían diferenciarse del día anterior y almacenarse.De hecho, SVN podría hacer esto por mí.Cuando quiero los datos de un día determinado, el sistema tiene que recuperar la versión de ese día y deserializarlos en objetos.Obviamente se trata de una operación costosa, pero el rendimiento no es tanto una preocupación en este caso.Estoy considerando usar LINQ para esto, lo que creo simplificaría las cosas.El procedimiento de serialización tendría que estar bastante organizado para que la diferencia funcione bien.

¿Qué enfoque adoptarías?

Gracias

¿Fue útil?

Solución

Todo lo que nos ha dicho sobre su sistema es que implica votos.Siempre que almacene marcas de tiempo de cuándo se emitieron los votos, debería poder generar un informe que describa el recuento del estado de los votos en cualquier momento...¿No?

Por ejemplo, digamos que tengo un sistema que cuenta las características favoritas (ojos, sonrisa, trasero,...).Si quiero saber cuántos votos hubo para una característica particular en una fecha particular, simplemente contaría todos los votos para la característica con una marca de tiempo menor o igual a esa fecha.

Si desea tener un historial de otras cosas, deberá seguir un enfoque similar.

Creo que así es como se hace.

alt text

Otros consejos

Si está básicamente preguntando cómo se almacenan las revisiones de los datos en bases de datos relacionales, entonces me gustaría ver en la forma global lo hacen.

Los wikis son trata de mantener la historia detallada revisión. Ellos usan bases de datos relacionales simples para su almacenamiento.

Considere base de datos de Wikipedia esquema .

¿Ha considerado el uso de un sistema de control de versión real en lugar de tratar de meter con calzador una base de datos en su lugar? Yo mismo soy muy parcial a git, pero hay muchas opciones. Todos ellos tienen un buen apoyo para las diferencias entre las versiones, y tienden a ser bien optimizado para este tipo de carga de trabajo.

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