Foros del Web » Programación para mayores de 30 ;) » Java »

Algoritmo sencillo para listado, necesito optimizarlo.

Estas en el tema de Algoritmo sencillo para listado, necesito optimizarlo. en el foro de Java en Foros del Web. Buenas tengo estas tablas (pongo solo los atributos necesarios para esta consulta) Cliente (CliId) Articulo (ArtId) Compra (ComId, objCliente) 1----->* LineasCompra(objArticulo) Lo que deseo es ...
  #1 (permalink)  
Antiguo 23/06/2010, 17:06
uv3
 
Fecha de Ingreso: noviembre-2009
Mensajes: 31
Antigüedad: 15 años
Puntos: 0
Algoritmo sencillo para listado, necesito optimizarlo.

Buenas tengo estas tablas (pongo solo los atributos necesarios para esta consulta)

Cliente (CliId)
Articulo (ArtId)
Compra (ComId, objCliente) 1----->* LineasCompra(objArticulo)

Lo que deseo es obtener por cada Articulo, que cliente lo ha comprado.
Para eso he diseñado el siguiente algoritmo.

A esta funcion la corro una vez por cada articulo que tengo registrado. La coleccion de "Compras" que le paso como parametros ya viene ordenada , por eso es que uso un atributo como bandera para optimizar un poco el algoritmo.

Código:
public Vector<Cliente> obtenerClientesQueCompraronArticulo(Articulo xobjA, Vector<Compra> xcolCompras)
        
        Vector<Cliente> colCliente= new Vector();
        Cliente objCBandera = null ;
 
        for (Compra objC : xcolCompras){
            
           if (!objC.getObjC().equals(objCBandera))
              
                if (objC.tengoEseArticuloEnAlgunaLineaCompra(xobjA)){
                    colCliente.add(objC.getObjC());
                    objPBandera=objC.getObjC();
                }
        }
        return colProveedor;
    }
La cuestion es que me funciona perfecto, pero si yo un dia llego a tener 1 millon de compras registradas en mi bd, y por ejemplo tengo 200 articulos registrados, voy a tener que recorrer 200 veces (una por cada articulo) el millon de compras que tengo, para asi saber que cliente me ha comprado tal articulo. Me preguntaba si talvez hacer algun algoritmo por corte de control pero no se como en este caso.

Si yo se que no era tan facil
  #2 (permalink)  
Antiguo 24/06/2010, 05:41
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 16 años, 2 meses
Puntos: 188
Respuesta: Algoritmo sencillo para listado, necesito optimizarlo.

Bueno, siempre puedes ampliar un pokito la base de datos y hacer una relacion de clientes y articulos que se actualice con los datos previos.
  #3 (permalink)  
Antiguo 24/06/2010, 11:42
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 21 años, 1 mes
Puntos: 51
Respuesta: Algoritmo sencillo para listado, necesito optimizarlo.

Lo que no entiendo es por que el filtro lo haces en Java en vez de directamente en la consulta SQL que saca los datos de la BDD. Las BDD son especialistas en filtrar así que sería mejor hacerlo ahí. Según la BDD que uses, si tienes foreign keys a las tablas directamente ya te crea indices y las consultas usarán esos índices, más optimo que eso...

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #4 (permalink)  
Antiguo 25/06/2010, 12:52
uv3
 
Fecha de Ingreso: noviembre-2009
Mensajes: 31
Antigüedad: 15 años
Puntos: 0
Respuesta: Algoritmo sencillo para listado, necesito optimizarlo.

Bueno gracias por las respuestas, no soy muy apto en base de datos, de todas maneras la consulta era necesario que fuese ejecutada en memoria. Pero ya obtuve una buena solucion la cual comparto..
Tampoco me sirve crear una tabla extra para guardar este tipo de registros ya que esta consulta se necesitara una ves cada tanto por lo cual con un siemple procedimiento la puedo resolver

Al Objeto Cliente, le voy a agregar un Vector<Articulo>, y luego al recorrer cada factura, obtendre el Cliente de esa factura y a ese Cliente le agregare los articulos de esta factura (siempre y cuando no los tenga agregados ya). De esta manera me bastara recorrer solo una ves la coleccion de facturas y asi poder crear el listado que necesito. Al final obtendre un Vector<Cliente> y cada cliente tendra los articulos que ha comprado..

Un poco de lo que tu decias "Fuzzylog", pero no en base de datos :)

Gracias por sus respuestas :)

Última edición por uv3; 25/06/2010 a las 13:01

Etiquetas: optimizar, algoritmos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:20.