Pessoal é o seguinte, estou precisando de uma ajuda, para fazer com que o processo não seja muito lento.
Atualmente tenho uma tabela chamada LOG, nela é armazenado tudo o que o usuário faz, por exemplo se ele clicou em uma página, é salvado nessa tabela log, ou seja, essa tabela é gigante!.
O problema é que não foi eu quem começou e criou esse projeto e o banco de dados do mesmo.
e o nome do usuário fica armazenado na própria menssagem. a tabela está nesse formato.
Reparem que o nome de usuário está dentro da menssagem.
Agora vamos ao problema, eu preciso fazer um filtro, para que o admin do sistema, selecione somente os Logs do usuário da cidade X que o ADMIN selecionar.
atualmente eu pego a mensagem inteira, separo o nome do usuário, testo se ele pertence a cidade, se pertencer insiro em um arraylist, e depois só utilizo o conteúdo do arraylist.
dessa forma, é necessário percorrer a tabela LOG inteira do mesmo jeito.
existe uma maneira de em uma consulta sql, separar o nome da pessoa, e já pegar a cidade do mesmo?
pois dessa forma, a geração do relatório fica muito lenta.
Uma solução é criar a coluna usuário e criar um update fazendo substring da mensagem para pegar o usuário. Antes disso seria bom alterar o sistema para colocar o nome do usuário na nova coluna.
Não adianta vc quebrou a formas normais.
ou vc normaliza ou ficarár lento mesmo.
Diz a primeira forna normal de Banco de dados, que não podemos ter atributo multi valorado e nem composto.
No seu caso vc quebrou a 1 primeira forna normal, olha que ainda temo mais 4 rsrs.
A sugestão seria normalizar pelo menos a primeira forna normal, eleminando o atributo composto ai.
Vamos imagina que temos o seguinte valor:
“Usuario:Um|Cidade:SãoPaulo|Estado:SP”;
Esse atributo é composto de 3 valores, vc teria um like em cidade, o banco não é vudu para otimizar a busca com like, ou seja ele vai ter que varrer.
Bom agora se você criasse 3 campos para esse exemplo: usuario,cidade,estado
e criasse um sql com like para cidade, ja comecaria a otimizar as buscas.
Mas com certeza não poderá normalizar por algum motivo, então acho que cache te ajudaria um pouco.
Mas isso é loucura, log em Banco de dados, e a rotação do log como fica? rsrs
Confiavel? rsrss, já não está, mas não teria dados anomalicos, já que você iria tirar da tripona e add em outra coluna.
Bom vc disse que teria usuario, então pode criar um campo para usuário que ja seria um melhoria, agora se o usuário tivesse um Dominio o dominio seria bem legal também.
pq ficaria algo:
where text like :paramLike and user.dominio = :paramDominio
select l.* // considerando que a coluna usuario seja valor unico na tabela de Usuario
from Log l
join Usuario u on (l.usuario = u.usuario)
join Usuario_Cidade uc on (uc.idUsusario = uc.idUsuario)
join Cidade c on (c.idCidade = uc.idCidade)
where c.nome = 'Belo Horizonte'