2008-10-12 14 views
9

¿Cuáles son las posibilidades de un programador para manejar datos que rara vez se utilizan pero que no se pueden eliminar simplemente porque al menos los informes todavía lo requieren?¿Cómo lidiar con los datos de base de datos viejos y obsoletos de un sistema de larga ejecución?

Algunos ejemplos que estoy pensando:

  • tipos de financiación Discontinuos de años anteriores de una universidad
  • monedas no utilizadas (por ejemplo, lira italiana)
  • Los nombres de los países desaparecidos (por ejemplo, Austria-Hungría, URSS)

Algunas soluciones parciales son indicadores de actividad, períodos de actividad, prioridades de visualización, pero cada uno de ellos significa una decisión caso por caso y es difícil saber wh en tipos de entidades necesita este manejo especial.

Puede haber un patrón de diseño para este problema.

Conclusiones: (basado en las respuestas hasta ahora)

  • Si los datos de edad hace difícil el trabajo diario en una enorme base de datos, la partición sería útil. La descripción de Oracle sobre este tema es here.

  • Desde el punto de vista del diseñador, la taxonomía de Slowly changing dimension proporciona algunos antecedentes.

Respuesta

4

Con los datos antiguos no utilizados en la mayoría de las consultas, la mejor solución es dividir las tablas por la clave que diferencia los datos obsoletos de los actuales (como date, currency_id o cosas por el estilo). A continuación, puede colocar los datos obsoletos en tablas, bases de datos o incluso servidores (según la configuración que tenga en ejecución).

La desventaja de esto es que su aplicación debe conocer la partición para saber dónde encontrar los datos (aunque hay abstracciones que ayudan a lidiar con la fragmentación y la partición).

+0

Me parece que la partición mejora principalmente el rendimiento y simplifica el mantenimiento, pero no resuelve el problema del diseñador. – rics

+0

¿Quién es el diseñador y cuáles son sus problemas sino el rendimiento y el mantenimiento? –

0

Una solución podría ser (registros suponiendo que hacen referencia a datos obsoletos son los más antiguos): archivo esos registros y eliminar los datos de referencia de edad.

+0

Archivar significa que no puedo usar los datos antiguos de los programas como antes, por lo que, por ejemplo, consultar las cuentas bancarias italianas de 1990 no será posible. – rics

1

En varios casos, he duplicado los datos antiguos y el programa anterior con el conjunto de permisos de solo lectura apropiado. Por lo tanto, los usuarios tienen la capacidad de ver los datos antiguos y hacer informes utilizando el programa anterior. Entonces puede avanzar el programa moderno como lo crea conveniente, eliminar columnas o tablas, migrar algunos datos, etc.

1

Realmente tiene que manejarlo caso por caso, ya que son las reglas comerciales las que definen cuándo un el registro obsoleto es relevante o no. Por ejemplo, en algunos resúmenes históricos tendría sentido incluir ventas a la URSS, en otros casos lo dejaría fuera.

Un patrón general sería tener un campo de tiempo de datos "relevante desde/hacia" en los registros. En ese caso, los informes históricos pueden incluir los tipos que son relevantes para el período. (Una solución más simple sería una bandera booleana "obsoleta" en los registros, pero dado que esto no indica cuándo era relevante, no será tan útil para el informe histórico.)

0

Además de lo que dijo Eran sobre la parición, podría automatizar parcialmente el proceso de decidir qué incluir en la parición archivada al tener una columna LastModified o similar. Luego, simplemente con la partición basada en LastModified < -1y más o menos, el sistema debería aprender sobre los datos obsoletos.

+0

Pero eso tomaría un año a partir de ahora para ser efectivo;) –

1

Este es el problema estándar de Dimensión que cambia lentamente. Tienes SCD con estado y/o rango de fechas.

"cada uno de ellos significa un caso por caso decisión y es difícil saber qué tipos de entidades necesitan este especial manipulación"

Sip. Lo siento por eso. Tienes que analizar tus datos y pensar. No es una forma fácil de entender la parte de pensamiento de esto.

+0

Sé que no hay almuerzo gratis. En caso de moneda o país, es claro a primera vista que pueden cambiar en el tiempo. Pero hay entidades menos obvias y si los usuarios definen reglas lógicas de negocios _en el momento_ cuando sus primeros programadores aparecen tienen que lidiar con la situación. – rics

+0

Derecha. Cada una de ellas es una regla comercial única y ad hoc, en ese momento. Sin solución general Eso también es cierto para los grandes almacenes de datos. Hay tres algoritmos estándar diferentes, según el nivel de ad-hocracy involucrado. –

2

Para cualquier entidad que pueda tener una vida útil limitada, simplemente agregue un componente de tiempo en su definición. P.ej. su lira italiana puede ser modelado como:

CREATE TABLE Currency (CurrencyID NUMBER, CurrencyStartDate DATETIME, CurrentEndDate DATETIME) 

A continuación, puede excluir las monedas caducados de cualquier función de aplicaciones relacionadas con la actividad actual, y todavía mantiene la relación de los datos históricos.

+0

He llamado a esta solución como período de actividad en mi pregunta. El problema con este enfoque es que cada consulta debe conocer esta nueva propiedad de la moneda. – rics

+0

Lo que usted llama "período de actividad" también se conoce como el "tiempo válido" y es un concepto importante en las bases de datos temporales, que escribí aquí: http://stackoverflow.com/questions/310963/relational-schema-for- Fowlers-temporal-expressions # 312534 si está interesado en los detalles y la investigación. –

0

Comercial DBMS (Informix, DB2, probablemente Oracle, ...) tienen capacidades de particionamiento o fragmentación tales que puede colocar datos diferentes en diferentes fragmentos, y el optimizador de consultas ignorará los fragmentos que sabe que no necesita. A veces puede usarlos para colocar los datos menos utilizados en áreas de almacenamiento que solo se usan para datos arcaicos. La ventaja de esto es que el sistema se ocupa de la ubicación (OK, el sistema más el DBA), y las aplicaciones son completamente ajenas a él.

Cualquier esquema que requiera cambios en las aplicaciones de informes está destinado a romper al menos algunas de esas aplicaciones.

1

Sugeriría separar el sistema operativo y el sistema de informes. Tenga una base de datos para el sistema operativo en línea y otra para los informes. (Podría ser un almacén de datos, o una simple otra base de datos) en función de cuán versátil sea el sistema de informes.

Mover periódicamente los datos del sistema operativo al sistema de informes. (la frecuencia depende de la naturaleza de su sistema). Todos los informes históricos se basarán en la base de datos de informes. La base de datos en línea también contendría informes, pero no (muy) históricos.

Y, sí. Debe mantener las fechas o los indicadores en las tablas para decidir si un elemento ha caducado .

0

Encontré una pregunta similar: What is the best way to implement soft deletion? que trata con la solución de indicador de actividad.

Y aquí hay otro en indicadores de actividad `active’ flag or not? para mysql y postgresql.

En base a estas dos preguntas, los indicadores de actividad y/o el particionamiento de la tabla son las soluciones más comunes al problema.

0

También puede actualizar los datos anteriores. Por ejemplo, puede convertir los montos de la lira italiana a importes en euros. Pero de hecho es una decisión caso por caso.Usted conoce su sistema y los requisitos mejor.

Cuestiones relacionadas