Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá pessoal,
Dentro o meu maior medo, na hora de desenvolver um sistema é acontecer o que o tio Bill Gates sofreu quando na apresentação deu tela Azul, e isso pode ocorrer a qualquer momento quando o desempenho do banco não dos melhores, num simples timeout do PHP.
Estava desenhando uma tabela, e espero que este quando estiver em produção tenha em média 50.000 registros que serão consultados todo o tempo, diversas vezes.
Um dos dados que precisarei informar é endereço completo, sendo ESTADO / CIDADE / BAIRRO campos INDEX e utilizados o tempo todo como critérios do SELECT.
Cada vez que a listagem é chamada, irei imprimir na tela do usuário a CIDADE / BAIRRO, portanto não posso armazenar apenas o ID da cidade ou bairro, e rodar um outro SELECT para cada registro.
A minha duvida é a seguinte, qual a melhor forma de armazenar estes dados pensando em desempenho de consulta, economia de memória de servidor.
Pensei nas seguintes opções
- Armazenar apenas o ID da cidade, cadastrada em outra tabela
CONTRAS
Cada vez que fosse chamados os registros (em média 10 por página geraria mais dez SELECT na tabela de cidades) perdendo em desempenho
- Armazenar o nome completo da cidade
CONTRAS
Pode gerar variações do mesmo dado (Campo CIDADE = São Paulo, Sao Paulo, S. Paulo, SP)
Me disseram que pesquisas por texto demoram mais que por indices numéricos, essa informação confere
- Armazenar um ID dessa cidade para relacionar com outra tabela e também o nome completo da cidade para não ter que buscar na outra tabela toda hora
CONTRAS
Dados armazenando informações teoricamente redundantes. (Ex. campos
ID_CIDADE => Para relacionar dados com outra tabela
NOME_CIDADE => Nome da cidade por extenso para ser impresso na tela do usuário sem ter que buscar em outra tabela.
Qual dessas opções é o melhor? Alguém sugere outra?
Agradeço a todos pela atenção e se puderem ajudar
Ficarei muito grato
Antes de tudo, obrigado Marco.
Essa será minha tabela principal cada vez que alguém submeter uma busca fara um select, mais ou menos assim
SELECT * FROM tabela WHERE estado = %s AND cidade = %s AND bairro = %s AND status = %s ORDER BY ranking DESC LIMIT 0,10
Você disse no post que "50.000 registros a consulta com ctz nem ia carregar a página"
O que quis dizer com isso:
E pensando depois que havia postado ontem, posso colocar as cidades cadastradas em outra tabela apenas e na hora do usuário cadastrar ao invés de colocar um text field, coloco um select field padronizando a digitação.
Sobre terceira opção que havia pensando em colocar um campo com um ID da cidade, seria para agilizar a busca baseado no que me haviam dito, que as buscas através de índices numéricos são muito mais rápidos que buscas em texto, então usaria o ID para filtrar e o campo com o nome da CIDADE / BAIRRO para imprimir para o usuário.
Agradeço pela ajuda.
Vlw
>
Você disse no post que "50.000 registros a consulta com ctz nem ia carregar a página"
50.000 não é nem a unha do MySQL Amigo, pode ficar despreocupado quanto á isso
>
Dependendo do Storage Engine que você estiver usando, pode ser que haja um intervalo na consulta, mais coisa de
0 - 20 segundos, usando Engine InnoDB, com formatos de linha Dynamic, juntamente á um INDEX, acredito que sua
tabela será igual uma turbina de avião, pra ser mais exato, um A380.
>
Não .. isso é bom fazer uma paginação, porque 50.000 registros pro PHP processar não é pouca coisa ..
então você com os resultados na não, você vai limitando a exibição dos mesmos
você poderia cadastrar tudo na mesma tabela... criando um indice..
duvida a tabela que vai chamar esses dados é outra tabela ??
uma maneira de fazer seria ter o literal cidade "nome da cidade", estado "nome do estado", bairro "nome do bairro" criado indices
se fosse fazer um editar nesses campos
//pega os registros
ficaria bem rapido e 50.000 registros a consulta com ctz nem ia carregar a página
com relação as suas 3 .. a ultima nem pensar....
a segunda é mais ou menos o que expliquei e a primeira é o modo mais tradicional.. relacionar as chaves estrangeiras criar os index (tb não haveria problemas)
Abraços
marco