Luís Henrique : CSS pra quem nunca viu
18 de Março de 2010, 0:00 - sem comentários aindaClaro que existem pessoas que estudam (ou trabalham com) computação e não conhecem CSS. Talvez o foco é outro (bem) distante de web ou há algum motivo para continuar a estilização via HTML. Vou tentar ser o mais direto possível, pois meu objetivo aqui é mostrar o básico através de exemplos.
Neste tutorial vamos construir uma área de artigos na qual cada uma da lista contém um título, uma imagem e o texto. O exemplo final será parecido com isso:
Exemplo final
Obs.: O texto foi gerado com o famoso Lorem Lipsum.
Definição
CSS – Cascading Style Sheet (folhas de estilo) – é uma linguagem para atribuir forma visual – estilo, formas, cores e tamanhos – a elementos usados na linguagem de marcação (HTML, XHTML e XML são exemplos).
Sintaxe básica
1 2 3 |
seletor { propriedade: valor; } |
CSS em ação
Veja como atua o CSS aplicado ao HTML na página descrita abaixo.
Primeiro o HTML
O HTML é da seguinte estrutura:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
quot;-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="pt-BR"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Título da minha lista de artigos</title> </head> <body> <div id="geral"> <div id="topo"> <h1><a href="#" title="Ir para a página inicial">Minha página</a></h1> <h2>Uma descrição do site.</h2> </div> <div id="conteudo"> <div class="noticia"> <h3 class="chamada">Título do primeiro artigo</h3> <img src="img1.jpg" alt="img1" title="Primeira imagem" /> <p>Texto da notícia aqui.</p> <a href="#" title="Continuar lendo esta notícia">Leia na íntegra</a> </div> <div class="noticia"> <h3 class="chamada">Título do segundo artigo</h3> <img src="img2.jpg" alt="img2" title="Segunda imagem" /> <p>Texto da outra notícia.</p> <a href="#" title="Continuar lendo esta notícia">Leia na íntegra</a> </div> </div> </div> <div id="rodape"> <p>Todos os direitos reservados.</p> </div> </body> </html> |
No HTML, usa-se os atributos ID e CLASS. Observe isso em div id e em h3 class.
Explicação do HTML
Dentro do head chamamos o arquivo estilo.css, que contém toda a estilização. Essa forma de aplicar o CSS é denominada “externa“, que pode ser lido no próximo item deste post.
A div #geral foi criada para englobar toda a página e definir uma largura geral.
A div #topo somente para conter o título da página.
A div #conteudo é onde ficam os artigos. Cada artigo é colocado dentro de uma div .noticia (com a CLASS noticia).
Dentro de cada div .noticia temos: o título do artigo dentro de um H3, o subtítulo em um H4, uma imagem e o texto em parágrafos. No final de cada artigo há um link permanente para a leitura completa.
Depois há uma div #rodape para conter informações de copyright e etc.
Maneiras de aplicar CSS ao HTML
1) Externo: todo o CSS fica em um arquivo (com extensão .css) separado do HTML. É chamado entre as tags head da seguinte maneira:
1 2 3 |
<head> <link rel=”stylesheet” type=”text/css” href=”estilo.css” /> </head> |
2) Interno: tag style dentro do head.
1 2 3 4 5 |
<head> <style type=”text/css”> Seletor { propriedade: atributo } </style> </head> |
3) Inline: aplica a(s) propriedade(s) somente a um determinado elemento, usando o atributo style do HTML.
1 2 |
<p style=”color:blue”>Parágrafo com fonte azul.</p> <p>Esse outro parágrafo não é azul, a não ser que exista <span style="color: #FF0">CSS em outro lugar</span>.</p> |
Diferença entre ID e CLASS
É tão trivial que muita gente erra nisso.
ID # (tralha) = deve ser único, usado em apenas um elemento
CLASS . (ponto) = número ilimitado de elementos
Por exemplo:
1 2 3 4 5 6 7 8 9 10 11 |
body { background: white; } #conteudo { background: #000; color: #000000; } .chamada { text-transform: uppercase; color: #FF6600; } |
O que fizemos:
1) O primeiro seletor (body) vai definir o fundo branco para toda a página. Como ele não tem atributo no HTML, o CSS referencia apenas com o nome da tag.
2) #conteudo para estilizar a div cujo ID é conteudo. Poderiamos usar tambem div#conteudo.
3) O terceiro elemento pode aparecer várias vezes na página. Portanto, usamos class.
Explicação do CSS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
@import url("reset.css"); body { background: #fde7d1 url(bg.png) repeat-y top center; font-family: Arial, Helvetica, sans-serif } a { color: #8B6914; padding: 2px 4px; } a:hover { background: #8B6914; color: #fff; text-decoration: none } p { margin-bottom: 15px; } #geral { width: 580px; margin: 0 auto } #topo { padding-top: 10px } #topo h1 a { padding: 5px 0; font-size: 220%; text-decoration: none } #conteudo .noticia { border-bottom: 1px solid #ddd; padding-bottom: 10px; } #conteudo .noticia .chamada { font-size: 200%; margin-top: 20px } #conteudo .noticia .subtitulo { color: #666; font-style: italic; margin: 10px 0 } #conteudo .noticia img { float: left; margin: 5px 15px 15px 0 } #conteudo .noticia p { text-align: justify } #conteudo .noticia p.direita { text-align: right } #rodape { margin-top: 30px; text-align: right } |
A primeira linha importa o arquivo reset.css pelo Erick Meyer. Leia mais sobre @import no site do Maujor.
Depois definimos o fundo da página e a família de fontes a ser usada. O fundo da página (bg.png) é uma imagem de apenas 2px de altura para economizar banda, pois a imagem se repete verticalmente (repeat-y). Para estilizar os links em estado normal e ao posicionar o mouse sobre eles usamos a e a:hover, respectivamente.
A div #geral tem a largura da área branca da imagem de fundo menos um tamanho lateral para espaçar um pouco das bordas. Para centralizar, basta definir margin-left: auto e margin-right: auto ou margin: X auto (x é a distância do topo e da base; é zero no nosso exemplo).
Um ponto importante é quanto ao uso do float. Como nosso exemplo é de apenas uma coluna, não usamos float em 2 divs de modo que fiquem lado a lado. Mas o float: left foi usado (na linha 18) nas imagens dos artigos. Com ele, a imagem flutua (óbvio) para esquerda, fazendo com que o texto se “esparrame” pelos lados da imagem. O margin é interessante para fazer com que o texto não fique grudado na imagem.
Este post é apenas uma introdução bem superficial de desenvolvimento web. O intuito é despertar o interesse de quem ainda não usa/conhece o CSS. Deixe seu comentário! Até a próxima.
Compartilhe:Sérgio Berlotto - Site Pessoal : ExtJS – Mão na massa
18 de Março de 2010, 0:00 - sem comentários aindaEntão, já conhecemos o Ext, e agora vamos botar a mão na massa !
Com um exemplo bem simples, podemos entender melhor como montar nossas paginas em Ext
Vamos iniciar com o Download do pacote do Ext:
Vá em extjs.com e clique no icone de “ExtJS for web developers”
Atualmente, a versão 3.1.1 é a que está disponivel.
Ah, para saberem, o ExtJS pode trabalhar em conjunto com mais algumas bibliotecas JS como: JQuery, Yahoo, Prototype e Scriptacuolus, porém eu nunca o utilizei desta forma.
Do Ext vamos precisar basicamente de 3 arquivos (veja o arquivo ./ext-3.1.1/INCLUDE_ORDER.txt) que serão referenciados na nossa pagina :
./ext-3.1.1/adapter/ext/ext-base.js
./ext-3.1.1/ext-all.js
./ext-3.1.1/resources/css/ext-all.css
Com o ext, podemos trocar o tema de cores das janelas e componentes, e no pacote padrão temos 3 temas, que se acrescentados depois do arquivo ext-all.css, funciona corretamente, alterando as cores.
./ext-3.1.1/resources/css/xtheme-access.css
./ext-3.1.1/resources/css/xtheme-blue.css
./ext-3.1.1/resources/css/xtheme-gray.css
E no fórum, pode-se achar mais alguma tema ou outro !
Bom, geralmente, eu tenho trabalhado com os JS separados do arquivo html, bem como os CSS, podendo assim reutilizar muitas coisas.
Então, vamos fazer assim também nossos exemplos.
Como o Ext faz todo o trabalho sujo de detectar o browser, ajustar coisas, resolver bugs de css e etc, então não precisamos nos preocupar com nada disto, e trabalhar como se montássemos uma simples interface em GTK ou QT por exemplo. Ok !
Vou colocar um exmplo simples abaixo, e depois vou explicar o que codifiquei:
Arquivo: index.html
[html]
[head]
[meta http-equiv="Content-Type" content="text/html; charset=utf-8" /]
[title id='title']Ext HTML Sample[/title]
< script src="http://moonmoon.archlinux-br.org//ext-3.1.1/adapter/ext/ext-base.js" type="text/javascript" >< /script >
< script src="http://moonmoon.archlinux-br.org//ext-3.1.1/ext-all.js" type="text/javascript" >
< script src="http://moonmoon.archlinux-br.org//index.js" type="text/javascript" >
[/head]
[body]
[/body]
[/html]
Arquivo: index.js
Ext.onReady(function(){ Ext.ns("Index"); Index.init = function(){ win = new Ext.Window({ layout:'fit', width:500, height:300, closeAction:'hide', plain: true, title: 'Janela de Exemplo - berlotto.blog.br', items: new Ext.TabPanel({ activeTab:0, deferredRender:false, border:false, items:[{ xtype: 'form', id: 'tabOne', title: 'Tab Um', bodyStyle: 'padding: 6px', items: [{ xtype: 'textfield', id: 'txtCampoTabOne', fieldLabel: 'Campo 1' }] },{ xtype: 'form', id: 'tabTwo', title: 'Tab Dois', //bodyStyle: 'padding: 6px', items: [{ xtype: 'numberfield', id: 'txtCampoTabTwo', fieldLabel: 'Campo 2' }] }] }), buttons: [{ text:'Enviar', handler: function(){ Ext.Msg.alert('Exemplo ExtJS', 'Dados salvos com sucesso!'); } },{ text: 'Fechar', handler: function(){ win.hide(); } }] }); win.show(); }; Index.init(); }); //end onReady
O que ocorre ? Vamos por parte, como diria Jack:
1.
Ext.onReady(function(){ …
Este é um evento do ext que é chamado quando ele for corretamente inicializado, e em 99% dos casos, os nossos codigos do Ext estará dentro deste método, garantindo que o FW estará carragado e OK para funcionar.
2.
Ext.ns(“Index”);
Definimos nosso Namespace, como detalhado no post anterior.
3.
Index.init = function(){ …
Dentro do nosso namespace chamado “Index”, criamos um objeto chamado “init”, que por sua fez recebeu uma function. Então agora temos uma nova função que pode ser chamada com: Index.init(), como visto no final no nosso arquivo index.js
4.
Conteúdo da nossa página ! O Ext tem vários tipos de componentes/widgets, e para que possamos utilizar temos que adicioná-los em um Container, que neste caso é nossa janela ( Ext.Window ). Os containers do Ext podem ser por exemplo: Ext.BoxComponent, Ext.Panel, Ext.Window, Ext.form.FormPanel, Ext.Toolbar, entre outros.
5.
Cada widgets tem suas propriedades e características, no Ext, temos uma imensidão de objetos que podemnos utilizar nas nossas aplicações, e com o que temos hoje, podemos criar muita coisa, sem ter que customizar nada mesmo, ou utilizar widgets criados pela comunidade ! Mas tem uma priedade especial: xtype.
O que ela faz ? Ela indica qual o tipo de objeto que será criado, assim:
Foi dito que no ext um Ext.form.FormPanel também é conhecido por “form”, OK !
Então quando criamos, no nosso exemplo, o nosso TabPanel, dentro da Window, dissemos que os items deste TabPanel são dois forms, porém você não vê um “new Ext.form.FormPanel” ali, você vê um “xtype: ‘form’” correto ? Sim, isto funciona, pois já temos um “new” acontecendo no objeto pai, então quando ele encontrar alguns objetos JSON com a propriedade xtype definida, ele tentará dar um new no respectivo objeto, conforme podemos ver neste link da documentação:
http://www.extjs.com/deploy/dev/docs/?class=Ext.Component
6.
Nestes mesmos dois forms que foram criados, temos a propriedade “bodyStyle”, 1 comentada e a outra não, para que vocês vejam, que apenas um pouquinho de conhecimento de CSS poderemos alterar alguns detalhes interessantes nos nossos widgets. Esta é apenas 1 das formas de se fazer isto.
7.
Neste exemplo, eu coloquei dois botões na janela e em um deles, coloquei uma mensagem de sucesso, porém não faz nada além de mostrar a mensagem, como podemos ver. E como geralmente gostamos de mostrar mensagens para ver se algum evento ou objeto está funcionando corretamente, nada mais justo que utilizar o proprio ext para isto neh !
Ah, detalhe: Nada no Ext é SINCRONO, ou seja, tudo é chamado, e nada fica trancado aguardando retorno, como as chamadas Ajax, esta chamada para a MessageBox mesmo, a chamada daquele “win.show()”, etc… é tudo ASINCRONO. Lembre sempre disto. Porém o Ext tem algumas ferramentas que nos ajudam quando precisamos montar algumas chamadas mais criticas, que necessitam ser ordenadas ( ver: http://www.extjs.com/deploy/dev/docs/?class=Function ).
Bom, acho que já ficou bem grandinha esta aula, então façam assim: olhem na documentação, as propriedades, eventos e métodos que estes componentes, por nós utilizados, tem e façam suas alterações e testes, nesta mesma tela. E voltem aqui para deixar suas perguntas, caso fiquem com alguma duvida. Ok !
PS.: Desculpem a codificação do index.html, pois não mostrou corretamente o codigo aqui no blog, então tive que alterar as tags.
codigo-ext-js (0)
Albino Biasutti Neto :: Blog : 31 de Março – Dia da Liberdade dos Documentos. Grade!
17 de Março de 2010, 0:00 - sem comentários aindaSaudações! Está fechada a grade do DFD. Local: Vitória/ES – Rua Anselmo Serrat, 199. FAESA, Campos I. Mini-auditório Data: 31/03/2010 (Quarta-feira) Mapa: http://migre.me/nQ5T 19:00 – 19:40 – Palestra: Soluções Livres! [Guilherme Chaves de Oliveira Barbosa] 19:40 – 20:20 — Palestra: Construindo uma publicação com software livre e formatos abertos: Um case da Revista Espírito Livre [João Fernando Costa Junior] 20:20 – 21:00 [...]
Thadeu Penna : Como uma mancha cresce
17 de Março de 2010, 0:00 - sem comentários aindaComo uma mancha cresce
Eu já comentei aqui, o problema do caminho aleatório (Random Walk). Falei no post do O azeite bêbado e fiz algumas simulações com o Processing.js, disponíveis na página do curso de Física Estatística que estou ministrando neste semestre. A experiência que eu quero realizar é medir como o diâmetro de uma mancha de tinta em uma folha de papel varia com o tempo. Vale ressaltar que este probleminha é inspirado em um outro que mostrou que átomos existem, ou comportamentos em mercados de ações, como um gás venenoso se espalha pelo ar, etc.
O que eu fiz foi o seguinte: filmei uma gota de tinta que cai no papel.
Agora eu retiro frames do vídeo, em intervalos regulares. O vídeo foi gravado a 30 fps, com uma câmera digital comum. O problema que eu enfrentei é que eu não quero todos os frames (são 7 segundos de filme, com 30 por segundo seriam 210 para analisar e eu queria por volta 15). Os programas que havia testado ou retiravam todos os frames ou só faziam snapshots de 1 em 1 segundo. A dica para resolver isto foi passada pelo Armando M. Baratti, na lista do Arch Linux. O que devemos fazer pelo ffmpeg é o seguinte: ele só tira frames de 1 em 1s, mas podemos mudar a velocidade do filme. Se repassarmos o filme em 15 fps por segundo, então 0.5s do filme original vai ser 1s do filme repassado. A sintaxe então é simples:
ffmpeg -i mvi_6484.avi -r 10 -ss 00:00:04 -t 00:00:06 extracted_images/images%03d.pngque faz o seguinte: pega o arquivo
mvi_6484.avi
, a partir do quarto segundo, com duração de seis segundos e tira 10 fotos por segundo. As fotos são salvas no diretório extracted_images, e com um rótulo que indica a ordem do frame. Eu pego cada foto e uso o Gimp para medir o tamanho da mancha. Depois uso o Gnuplot para medir o tamanho em função do número do frame (nem precisa saber quanto tempo em unidades tradicionais como minuto ou segundo). O resultado está no gráfico abaixo do tamanho em pixels versus o índice do frame
Observe que a gota não cresce com velocidade constante, mas é mais lenta à medida que o tempo passa. Na verdade, o raio da gota cresce com a raiz quadrada do tempo (como mostrado por Einstein em 1905). Eu não vou dar detalhes aqui pois isto é um trabalho para os estudantes da disciplina :) . Prometo que depois eu conto o resto.
Clécio Oliveira : Primeiro Aniversário do Blog
16 de Março de 2010, 0:00 - sem comentários aindaHá exatamente 365 dias era publicado o primeiro post deste blog. Este post inaugurou também o início da minha acabativa para a sua criação. Este dia não foi escolhido a toa já que também é dia do meu Aniversário, e assim como o dia do meu nascimento este blog se tornou muito importante para mim.
Foi um período muito interessante de aprendizagem, horas de dedicação e alguns momentos de stress também. Mas, fico muito feliz por ter redescoberto o prazer de escrever e ter feito tantas amizades virtuais. Alias, esse é o maior presente: ligar (desbloquear já que só fica ligado) o computador e ler os comentários de vocês, saber que pessoas de diversos lugares passaram por aqui, leram o que escrevi, serviu de ajuda para alguém e deram sua opinião.
Estou muito feliz por isso, pois este é objetivo do blog, oferecer um conteúdo útil visando sempre a troca de informação referente a tecnologia, meu dia-a-dia e outros assuntos que compartilhamos o mesmo interesse.
Obrigado por fazerem parte desse meu mundo!
Clécio Oliveira
@cleciooliveira
Albino Biasutti Neto :: Blog : Programação – Linguagem C
12 de Março de 2010, 0:00 - sem comentários aindaSaudações… Estou estudando esta linguagem porque é um das mais interessantes e um código que com ela irá aprender vários outras. Um breve resumo sobre o C. Retirado da Wikipedia. O desenvolvimento inicial de C, ocorreu no AT&T Bell Labs, entre 1969 e 1973. Não se sabe se o nome “C” foi dado à linguagem porque muitas de [...]
Hugo Dória - hdoria : GreenSQL – Protegendo seu MySQL de SQL Injection
12 de Março de 2010, 0:00 - sem comentários aindaO número de aplicações WEB tem aumentado bastante nos últimos anos, mas, infelizmente, os desenvolvedores parecem não se preocupar com a segurança delas.
É cada vez mais comum encontrarmos vulnerabilidades nas páginas WEB e uma das mais populares é a SQL Injection.
Felizmente, existem algumas ferramentas que servem para proteger suas aplicações desta falha. Uma delas é o GreenSQL, um um firewall usado para proteger uma base de dados MySQL de ataques de SQL Injection.
Veja o artigo completo aqui.
Marcelo Cavalcante - kalib : FLISOL Fortaleza 2010
12 de Março de 2010, 0:00 - sem comentários aindaSaudações pessoal!
Quem é vivo sempre aparecer…
Não, eu não abandonei o blog. Apenas estava sem recursos para continuar postando. Meu notebook resolveu apresentar problemas sérios depois de 4 anos na luta e acabei tendo de comprar outro. Ainda não chegou, portanto ainda está difícil conseguir postar por aqui.. mas cá estou.
Como todos já devem saber sou militante do movimento de Software Livre e como tal sempre estou engajado em algum projeto/evento que envolva liberdade e compartilhamento de conhecimento. Neste momento estou me focando no FLISOL Fortaleza 2010.
Para quem ainda não conhece o FLISOL, Festival Latinoamericano de Instalação de Software Livre, é um evento anual que acontece, como o próprio nome indica, simultaneamente em toda a América Latina. Mais de 150 cidades sediam o evento com organizações locais que trocam informações e ajuda entre si para tal.
Desde 2005 estou direta ou indiretamente engajado na organização do mesmo aqui em Fortaleza, portanto neste ano não poderia ser diferente. Um dos grandes diferenciais, e minha maior motivação, deste ano é o fato de estarmos, também, comemorando o aniversário de 5 anos da Comunidade Tux-CE.
O evento se baseia em, basicamente, instalar Software Livre nas máquinas dos visitantes que não possuem experiência ou não se sintam seguros para o fazerem sozinhos, porém em algumas cidades, como é o caso aqui em Fortaleza, optamos por fazer mais do que simplesmente instalações. Sempre temos palestras, apresentações, demonstrações, distribuição de mídias com distribuições Linux e outros softwares livres, etc…
Neste ano estamos adotando o recurso de “Páginas Amigas” como uma forma de ajudar e ser ajudado! Bem a cara do Software Livre, certo?!
Se você possui um site, blog ou qualquer coisa que o valha, pode submeter-se como uma página amiga do FLISOL. Com isso você terá um banner de seu site, blog ou coisa que o valha exposto em nossa página do FLISOL em troca de um banner do evento no seu. É uma espécie de ajuda mútua onde ambos se beneficiam. Para conseguir mais detahes sobre como se tornar uma página amiga do FLISOL, visite este link.
Amanhã mesmo teremos uma reunião de organização do evento na qual discutiremos mais alguns detalhes sobre o mesmo.
Em breve volto a publicar maiores detalhes.
Abraços!
Arch Linux Brasil : Tradução da Arch Linux Newsletter de Março
10 de Março de 2010, 0:00 - sem comentários aindaAqui: http://www.archlinux-br.org/alm/2010/Newsletter-2010-Mar.html Boa leitura! Agradecimentos ao Leandro Costa que não deu chances ao seus colegas e traduziu a edição desse mês por completo ;-)
Sérgio Berlotto - Site Pessoal : Dicas para SQL Relacional
10 de Março de 2010, 0:00 - sem comentários aindaFonte: http://www.catswhocode.com/blog/10-sql-tips-to-speed-up-your-database
Aproveitando a dica do @pinceladasdaweb, dei uma lida no post e vou fazer uma tradução livre aqui, acrescentando meu ponto de vista e mais algumas dicas sobre SQL em um banco de dados relacional:
1. Defina seu banco de dados com cuidado
Um bom banco de dados é um banco de dados bem desenhado, que não gera tanto trabalho para buscar as informaçoes e que não guarda dados duplicados. É um banco que tem uma estrutura clara e com nomes de tabelas e campos identificáveis.
2. Otimize o que for necessário
Nem todos os SQL que utilizaremos devem e podem ser utilizados. Mas várias instruções podem e DEVEM ser otimizadas. Para o banco cada query tem um custo, e utilizando a ferramenta e EXPLAIN, que tem em praticamente todos os bons bancos de dados, podemos ver o que está afetando mais nossa query. Cuide os joins, linhas desnecessárias, igualdades incorretas, falta de indices, etc…
3. Use algo para agilizar
Utilizar um sistema de cache é sempre muito bom, e não apenas para as querys. Pois tudo que tem que ser gerado e processado gera custo e tempo, sendo que se você já tem um resultado pronto, do que você quer, sendo q o mesmo já foi processado a algum tempo atrás é muito bom ! Isto acaba com o tráfego na rede e no processamento do banco.
No site ele cira algumas ferramentas interessantes. E devem ter outras também.
4. Não selecione o que você não precisa
Corretíssimo! Nada de “select * …” por ai heim !
Coloque na projeção do SQL ( aquela parte depois do “select” e antes do “from” ) apenas os campos que você vai precisar. Isto nos além de gerar menos custo para o banco, acaba organizando nosso retorno e padronizando a aplicação.
5. Limite o numero de linhas a serem retornadas
Geralmente o usuário final, aquele que está vendo aquela listagem de algum item na tela, não vai precisar de todos os itens que tem cadastrado na tabela. Então use paginação ! Sempre ! Limitando o número de linhas a serem retornadas do banco o custo cai ser bem menor e a resposta vai ser mais rápida. O uso de Ajax ( para web ) geralmente ajuda bastante nestes casos.
6. Não coloque chamadas ao banco dentro de loops
Organize seu código, que eu duvido que você não conseguirá unir todos os dados necessários em apenas 1 ou 2 chamadas no banco, ao invés de colocar a query em um loop. Lembre-se, que o quanto menos tiver que acessar o banco melhor !
7. Utilize JOINS ao invés de SUBQUERYs
Concordo ! A não ser em casos muito, muito complexos, não utilize subquerys, elas são muito mais pesadas e são executadas 1 vez para cada linha retornada da nossa query pai, gerando assim um custo enorme para o banco. E subquerys na projeção NEM PENSAR ! NUNCA !
8. Utilize os wildcards
Até certo ponto eu levo isto como uma feature mesmo, do SQL ansi, com o comando LIKE, do que um forma de otimização.
9. Utilize UNION ao invés de OR
Bem, eu não entendi direito o pq desta dica, até mesmo pq eu não utilizo o MySql, mas para mim isto não é válido, pois na grande maioria dos casos esta troca causará um aumento de custo ao banco, e não o contrário. Mas sempre teste sua query com mais de uma forma, talvez este seja seu caso.
10. Use Índices
Sim ! Use indices no seu banco. Mas além das PK e os indices para elas criados automaticamente, utilize somente indices em campos e tabelas que necessitarão deles. Se un indice não é utilizado em nenhum momento, em nenhuma query, exclua-o, pois ele estará gerando trabalho em vão para o banco atualizá-lo.
Como eu faço:
- Rodo a query e analiso
- Crio indices onde eu acho que deve ser criado
- Rodo a query e analiso
- Crio, altero e excluo mais algins indices onde eu acho que deve
- Rodo a query e analiso
- Excluo todos os indices que não estão sendo utilizados
- Rodo a query e analiso
- Pronto!
Geralmente estes poucos passos bastam controlar a criação de indices.
11. Triggers – Tome cuidado com elas
Elas podem nos ajudar muito, mas podem deixar o banco de dados lentão e até gerar dead-locks. Então pense bem se é realmente necessário criar tal procedimento como uma trigger.
12. Sequences/Autoincremento
Estes campos nos facilitam muito o controle das PKs e não oneram em trabalho do banco.
13. Procedimentos pesados, Batch
Estes sim eu aconselho a, sempre que possível, serem executados dentro banco.
A linguagem que roda dentro do banco de dados é muito mais ágil ao trabalhar com os dados do que ficar trazendo e enviando dados do banco até a aplicação. E isto em procedimentos que geram informações de cálculos violentíssimos, ou controles com muitos dados, e que podem demorar para rodar, podem ser colocados dentro do banco.
No PostgresSQL por exemplo, temos não somente o Pl/pgSQL, mas sim inúmeras linguagens que trabalham dentro do DB, no Oracle tem o PL/SQL, e assim vai…
No mais é o seguinte:
- Sempre teste suas querys com mais de uma forma, trocando campos de lugar, trocando a ordem dos joins e das filtragens.
- Quantos aos frameworks de banco, leia bastante na documentação como fazer para agilizar as pesquisas.
- Aprenda a alterar as principais configurações do seu banco de dados para que ele trabalhe melhor para sua aplicação, sendo que ela faz mais gravação de dados ou mais leitura de dados.
- A infra estrutura do ambiente de produção todo é muito relevante, tanto para a aplicação como para o banco. Sempre ter o banco em uma máquina separada da aplicação é ótimo!