Bases de Datos - Consultas con Históricos

 
Vista:

Consultas con Históricos

Publicado por Sergio (2 intervenciones) el 19/06/2008 13:39:36
Hola a todos y gracias por adelantado:
Mi consulta es la siguiente, he creado en MySQL una tabla para guardar clientes con un id, el caso es que cada vez que modifico algún dato del cliente no hago un update sino que añado un registro más clonando el anterior y modificando lo editado, cada registro tiene la fecha y hora de creación con lo que el de mayor fecha es el dato correcto (actual). De esta forma tengo un histórico del cliente. Por ejemplo, suponemos que tenemos estas columnas: id, nombre, poblacion, teléfono, edad, fecha_modificacion, para obtener el último registro de todos hago lo siguiente:
select * from tabla a, (select id, max(fecha_modificacion) as fhm from tabla) b where a.id=b.id and a.fecha_modificacion=b.fhm
y con esto la cosa funciona pero tengo unos 50000 registros en la tabla y la cosa empieza a ser lenta...
También veo inecesario sacar todos los id con sus max(fecha_mod), tabla b, cuando quizá solo filtro por un campo como por ejemplo poblacion:
select * from tabla a, (select id, max(fecha_modificacion) as fhm from tabla) b where a.id=b.id and a.fecha_modificacion=b.fhm and a.poblacion='MADRID'
En definitiva, tengo problemas de lentitud y no domino muy bien las bases de datos ¿me ayuda alguien?
Por ciento he creado un índice de varias columnas como id, fh ya que no puedo crear claves primarias por id por repetirse el número en cada registro del cliente...
Bueno, quedo en vuestras sabias manos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Consultas con Históricos

Publicado por Franklin Gamboa (188 intervenciones) el 19/06/2008 15:19:13
Buenas

Guardar históricos de los datos es una buena practica, pero tener los datos históricos con los actuales no lo es tanto, creo que ya estas viviendo algunas consecuencias de ello.

Generalmente lo que se acostumbra es tener dos tablas, por ejemplo clientes y la tabla historico_clientes entonces en clientes solo estan aquellos clientes activos y con los datos actuales y en historico clientes todos los clientes inactivos (borrados del sistema) y los datos anteriores de los clientes, claro que aqui es donde se pone la fecha de modiifcación y lo que existe aqui es un id_historico_cliente que es la llave de esta tabla.

Esto genera varios beneficios:
1. Las consultas van a ser rápidas al tener que aplicar menos filtros y manejar datasets mas pequeños
2. Todos los datos históricos estan separados de los datos actuales lo cual aumenta el orden en la base de datos (ya que actualmente a como lo cuentas es como guardar las medias sucias con las limpias)
3. Mayor control sobre el tamaño de la base de datos(cuando crezca mucho guardas la tabla historica a archivos planos y la truncas)

Espero haberte ayudado

Saludos,

Franklin Gamboa M
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Consultas con Históricos

Publicado por Sergio (2 intervenciones) el 19/06/2008 17:09:45
Muchas gracias Franklin,
correcto, es lo que estaba pensando y por pereza no quería hacer...
Lo que tengo en mente si a nadie se le ocurre algo es que las nuevas inserciones las guardo en la tabla clientes previo copiado de lo que ya había sobre ese cliente en una tabla llamada clientes_historicos...
He probado a hacer la misma consulta de muchas formas y tras perder el tiempo, frustrarme y atender menos a mi familia... si nadie tiene una idea mejor haré eso que no es poco trabajo ya que me toca cambiar el código de la aplicación con la que se está trabajando.

De nuevo MUCHAS GRACIAS!!!
PD: Hoy he aprendido a separar la ropa sucia de la limpia, sin tirar la sucia ;-)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

...

Publicado por Leopoldo Taylhardat (187 intervenciones) el 21/06/2008 14:49:32
Saludos desde maracay, Venezuela...

Por mi parte te puedo decir que en verdad ese diseño de base de datos o es funcional...

Ahora por lo que explicas, seis mil registros (tuplas) es NADA para una base de datos del tipo de Mysql... aunque creo que tiene deficiencias (es mi opinión) con respecto a las BD 'comerciales' como las nombro, sé que esta puede funcionar con millones de registros...
Ahora por lo que expones, para que no tengas que tocar mucho la BD yo haría lo siguiente...

1) Crearía un índice de la tabla con las columnas 'cliente', 'fecha invertida' y el 'identificador'....
2) Crearía un índice de la tabla con las columnas 'cliente', y el 'identificador', y haría la busqueda de esta manera (más o menos)....

select 'identificador' ,'cliente'... etc... etc... from tabla etc, etc, etc...
WHERE cliente = parametro_cliente and fecha in (select max(fecha) from tabla where cliente = parametro_cliente...

Nota...
No sé si MySql puede crear índices con valores de columnas invertidas.... si nó es así puedes crearlo con la fecha ascendente y creo que la diferencia de tiempo no va a afectar mucho...

Prueba y expones....
Espero que te sirva...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Consultas con Históricos

Publicado por Daniela (1 intervención) el 27/06/2008 21:05:02
hola me dejaron como tarea este tema de base de datos historicas y nesecito un ejemplo o grafico de esto ,te agradeceria mucho si me puedes ayudar con esto.Atentamente Daniela
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Consultas con Históricos

Publicado por Franklin Gamboa (188 intervenciones) el 30/06/2008 23:03:36
Primero debes definir que tablas tendrán su correspondiente tabla histórica, generalmente se acostumbra que sean tablas que sufren muchos cambios a lo largo del ciclo operativo del programa (por ejemplo, asientos contables, encabezados y detalles de facturas entre otros), luego de esto se procede a definir exactamente que información se desea guardar, puedes guardar toda la fila, puedes guardar toda la fila, la fecha de modificación, el motivo por el cual fué enviado a la tabla histórica, o puede que nada mas quieras guardar datos parciales de la tabal original, pero esto lo definen las reglas de negocio.

Luego de esto se define la tabla y el proceso mediante el cuál la información será migrada, tambien se debe definir si la tabla histórica estará en la misma base de datos o si no, y si a su vez esta estará en el mismo server o no.

Espero haberte ayudado, si tienes una consulta mandame un correo y con gusto te ayudo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consultas con Históricos

Publicado por bade (1 intervención) el 11/03/2014 16:03:39
Podrias crear una view o vista de esta consulta:

select tabla.*
from tabla
INNER JOIN (select id, max(fecha_modificacion) as fhm from tabla) b
ON ((tabla.id = b.id)
and (tabla.fecha_modificacion = b.fhm))

y llamarla tablaDatosActuales, asi esta vista únicamente contendría el registro actual de cada cliente y rehacer tu consulta como:

select tablaDatosActuales.*
from tablaDatosActuales
where tablaDatosActuales.poblacion='madrid'

el uso de INNER JOIN hace la consulta mucho mas eficiente que hacer un producto cartesiano de todos los registro de tabla con todos los registros de la subconsulta [el from tabla a, (select id, max(fecha_modificacion) as fhm from tabla) b]

Nota: tambien se gana tiempo al escribir la consulta como "select tabla.*" o"select tablaDatosActuales.*" y no como "select *" (no es que se ahorre mucho tiempo, pero algo se gana)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar