Há algumas semanas o iMasters soltou no seu Twitter (@iMasters) a hashtag #DevQuestion. O objetivo foi saber quais as principais dúvidas que os usuários tinham sobre um determinado tema – no caso, Banco de Dados.
Por ser colunista do portal nesta área, me pediram para responder às às 10 melhores perguntas feitas. Confira.
Como criar uma DTS em MySQL para atualizar um ERP? - PHrafa
R: O DTS (Data Transformation Services) é o nome utilizado para um pacote que faz algum tipo de transformação e carga de dados entre uma fonte (origem) e um destino. Este pacote é criado na ferramenta chamada Enterprise Manager do SQL Server 2000. A partir do SQL Server2005, utiliza-se um pacote do SSIS (SQL Server Integration Services) para este tipo de manipulação.
Para criar um pacote que manipula dados que estão no MySQL e atualizar o ERP, primeiro é preciso configurar as conexões entre as fontes dedados. Para o MySQL é preciso instalar um driver ODBC disponível nosite do MySQL. Já para a conexão com o ERP é preciso verificar qual banco de dados este software usa e qual é o mecanismo de acesso para tal banco. Geralmente isso envolve configurar um driver ODBC oumesmo um provider OLEDB. Infelizmente um pacote DTS não trabalha com drivers JDBC (utilizados no JAVA).
Uma vez que estes requisitos estejam atendidos, é preciso definir alguma transformação nos dados como, por exemplo, a separação de uma coluna em várias, a complementação de valores, o descarte de colunas não utilizadas, alguma conversão ou transformação e outras manipulações. Os detalhes específicos do que fazer com os dados da fonte (MySQL) antes de jogá-los no destino (o banco dedados do ERP) devem ser bem definidos antes de implementados no pacote DTS.
Dentro de um pacote DTS existem diversos componentes, chamados de TASKs, que lhe auxiliam em cada passo do processo. Alguns componentes são para indicar a origem ou destino de dados e outros são para realizar mapeamentos, transformações, uso de programação ou da linguagemSQL. Para mais informações e exemplos de pacotes DTS recomendo o seguinte site: http://www.sqldts.com/
Se você não possui o SQL Server, é possível realizar este tipo de transformação com outras ferramentas de ETL de software livre como o Kettlee o TalendOpen Studio
É possível colocar auto incremento na chave primária do SQL Server 2005+? - RafaelFoi
R: Sim, a funcionalidade de auto incremento (chamada de identity no SQLServer) pode ser utilizada em qualquer versão e edição do SQLServer, tanto em tabelas novas como em tabelas existentes. Um exemplo de criação de tabela nova:
CREATE TABLE T_INCREMENTA
(
ID INT PRIMARY KEY IDENTITY(1,1),
NOME VARCHAR(10)
)
Os links abaixo mostram como colocar a propriedade identity em colunas de tabelas existentes:
- http://www.mssqltips.com/sqlservertip/1397/add-or-drop-identity-property-for-an-existing-sql-server-column/
- http://stackoverflow.com/questions/1049210/adding-an-identity-to-an-existing-column
Na sua opinião, qual o melhor, MySQL ou Postgres? - vinikampff
R: Bem, a escolha de um banco de dados como o MySQL ou o PostgreSQL depende de vários fatores. Dizer qual é o melhor envolve especificar sob qual aspecto ele é melhor, pois tanto o MySQL como o PostgreSQL possuem diversos pontos positivos e negativos. Além disso, é preciso levar em consideração diversos outros fatores como usabilidade, plataforma, integração com aplicações, recursos do banco de dados, produtividade, suporte, disponibilidade de mão de obra especializada etc.
Analisando o uso destes bancos de dados, pode-se notar que o MySQL é utilizado principalmente para aplicações web como blogs, sites de e-commerce pequenos, redes sociais e outros. Já o PostgreSQL é empregado em aplicações corporativas, sistemas financeiros, ERP dentre outros.Para mais informações e algumas opiniões de especialistas sobre oMySQL e o PostgreSQL, recomendo os dois episódios do DatabaseCast que falaram sobre MySQL e PostgreSQL apresentados nos links abaixo:
Quando devemos usar procedures? Dada uma aplicação pequena, há alguma vantagem? - tiu_uiLL
R: A utilização de stored procedures, mesmo para aplicações pequenas, possui vantagens e também desvantagens. Por exemplo, quando se utiliza stored procedures:
- O processamento é feio onde os dados estão e não há necessidade de transmitir os dados do servidor que está o banco de dados para o servidor onde está a aplicação;
- É possível programar utilizando os recursos comuns de linguagem de programação (variáveis, loops, if, etc) em conjunto com os recursos da linguagem SQL (SELECT, INSERT, UPDATE e DELETE);
- Pode-se utilizar stored procedure como se fosse uma instrução SELECT, INSERT, UPDATE, e DELETE pois ela pode retornar resultados no formato de linhas e colunas;
- É possível contar com opções para cache, segurança, criptografia, otimização, priorização de execução e outros;
- É preciso manter o código da stored procedure (gerenciar mudanças, testar, fazer refatoração etc) fora da aplicação.
Contudo, recomendo verificar no seu projeto se estas características fazem sentido. Destaco que não há uma solução para todos os casos: é preciso analisar, testar, medir e ponderar se as características de uso de stored procedures produzem ou não benefícios em relação a outras abordagens.
Qual a melhor opção para exportar milhares de registros de apenas um id (e-mails) de um db SQL com mais de 100MB, para um .txt? - marcossilveira
R: Os bancos de dados relacionais (SQL Server, MySQL, Oracle, PostgreSQL,DB2 etc) e NoSQL (MongoDB, Redis, Cassandra etc) possuem ferramentasde linha de comando para a exportação de dados que estão dentro do banco para arquivos texto em um formato. Verifique o banco SQL que você utiliza qual é a ferramenta de linha de comando adequada para esta exportação.
A escolha da melhor opção depende do banco que você utiliza e do formato. Para a exportação de apenas uma coluna o formato .txt pode ser adequado, pois além de ele ser gravado rapidamente (dependendo do seu hardware), ele pode posteriormente ser compactado para tornar a transferência mais rápida.
Quando o sql2008R2 está processando um procedimento faz uso de processadores da máquina vistos no gerenciador? - felipecvenancio
R: Sim, com certeza! O processamento do SQL Server é apresentado no gerenciador de tarefas através do processo do SQL Server(SQLServer.exe ou similar). É complicado associar a execução de uma única instrução SQL diretamente com o consumo de processamento, porém pode ter certeza de que cada instrução SQL vai utilizar os processadores da máquina. Talvez nem todos os processadores (ou núcleos) sejam utilizados por uma instrução, pois o plano de execução gerado é quem vai distribuir a carga de processamento e coordenar como será feito o I/O na memória e no disco.
Estou migrando de VB6 c/ Access (ADO) para VisualStudio2010 e não sei bem qual banco seria mais adequado. - ricardojfelipe
R: A utilização de um banco de dados pouco depende da troca de VB6 parao Visual Studio 2010, pois atualmente você tem diversas opções para trabalhar com ambas as tecnologias.
A escolha do que utilizar para armazenar e trabalhar com os seus dados vai depender de muitos fatores como os que foram comentados na questão 3. Você tem a opção de utilizar bancos relacionais (SQLServer, Oracle, MySQL, PostgreSQL, DB2 etc), que possuem muitas semelhanças com o Access e que podem facilitar as modificações noseu código. Há também opções NoSQL (MongoDB, Redis, Cassandra,Hadoop, Big Table etc) e diversos outros mecanismos para trabalhar com seus dados na aplicação, tais como Prevayler, NHibernate e SQL Lite.
Tenho visto muitas aplicações migrando do Access diretamente para servidor como o SQL Server e MySQL apenas por questões de simplicidade da modificação do código e características do licenciamento. Contudo, esta opção pode ou não ser adequada no seu caso, dependendo das características do seu projeto.
Como funciona o map/reduce no MongoDB?
R: O map/reduce é uma maneira de se agregar dados no MongoDB. A ideia é a seguinte: a partir dos dados de uma coleção, será efetuado um processamento e será retornada uma outra coleção. O processamento em si é realizado através de duas funções: uma que mapeia os dados (o map) e a outra que faz a agregação ou redução (reduce).
É possível fazer um paralelo com o uso de funções de agregaçãocomo SUM(), MIN() e MAX() quando se utiliza o operador GROUP BY emuma instrução SELECT. Porém, no MongoDB, é preciso programar em JavaScript tanto a função que faz o mapeamento quanto a função que faz a redução. Vamos ver um exemplo simples:
Primeiro criamos uma coleção com um atributo que é um array com palavras.
> db.things.insert( { _id : 1, tags : ['dog', 'cat'] } );
> db.things.insert( { _id : 2, tags : ['cat'] } );
> db.things.insert( { _id : 3, tags : ['mouse', 'cat', 'dog'] } );
> db.things.insert( { _id : 4, tags : [] } );
Vamos supor que precisamos obter a quantidade de repetições de cada palavra. Para fazer isso com o map/reduce, primeiro devemos criar uma função que faz o mapeamento (map) como mostrado abaixo:
> m = function(){
this.tags.forEach(function(z){
emit( z , { count : 1 } );
});
};
O que a função me faz é retornar um documento através de emit(). Este documento conterá a coleção (z) e o atributo count com a quantidade para cada palavra. A função que efetivamente faz a conta é o reduce, como mostrado abaixo:
> r = function( key , values ){
var total = 0;
for ( var i=0; i<values.length; i++ )
total += values[i].count;
return { count : total };
};
Podemos executar a operação map/reduce na coleção things, com as funçõesm() e r() e que retorna a coleção resultado da seguinte maneira:
> calculo = db.things.mapReduce(m, r, { out : "resultado" } )
O resultado do processamento está na variável calculo:
>calculo
{
: , "result" " resultado "
: 12, "timeMillis"
: { "counts"
: 4, "input"
: 6, "emit"
: 3 "output"
},
: 1, "ok"
}
Já a contagem de palavras está na coleção resultado:
>resultado.find()
{ : , : { : 3}} "_id" "cat" "value" "count"
{ : , : { : 2}} "_id" "dog" "value" "count"
{ : , : { : 1}} "_id" "mouse" "value" "count"
Qual a vantagem de usar gridfs no MongoDB?
R: O gridfs é uma especificação para o armazenamento de arquivos no MongoDB. Seu objetivo principal é permitir que arquivos com tamanhosmaiores que 4 MB possam ser armazenados, uma vez que o limite de 4 MBé devido ao JSON.
Em geral, utiliza-se o gridfs para o armazenamento de arquivos binários com tamanhos acima de 4 MB como imagens, vídeo e áudio. Além de armazenar o conteúdo do arquivo no formato binário o gidfs, gera metadados automaticamente. Adicionalmente, é possível criar índices para acelerar o acesso a estes dados.
A vantagem está na possibilidade de trabalhar com o conteúdo grande de arquivo como se fosse o valor de um atributo normal no JSON. Obviamente, é possível mesclar a funcionalidade de sharding com o conteúdo que está armazenado no gridfs. Seguem alguns links cominformações sobre o uso do gridfs junto com o driver em PHP para o MongoDB:
- http://www.mongodb.org/display/DOCS/GridFS+Specification
- http://learnmongo.com/posts/getting-started-with-mongodb-gridfs/
- http://www.lightcubesolutions.com/blog/?p=209
Qual o melhor SGDB para trabalhar com clusterização?
R: A utilização de um cluster deve ser considerada após uma boa definição do que se deseja obter. Em geral, a utilização de um cluster envolve requisitos de alta disponibilidade e não envolve processamento distribuído para otimizar o desempenho.
Quando o cluster é empregado para alta disponibilidade, ele é uma solução que envolve o servidor inteiro. Supondo que haja mais de um banco de dados no seu servidor, o cluster só vai ser ativado e as aplicações migradas para o outro nó (processo conhecido como failover) quando ocorrer um erro que incapacite o servidor como um todo (perda de conexão, falha catastrófica de disco, falhar do sistema operacional etc). Se apenas um banco de dados tiver algum problema e os demais continuarem a funcionar, o cluster se mantém com está.
Cada SGBD possui características e funcionalidades diferentes para montar o cluster, além de outras soluções para alta disponibilidade, escalabilidade, balanceamento de carga, replicação e processamento distribuído. Para dizer qual é o melhor, é preciso especificar o aspecto tal como "menor downtime possível" ou "mais fácil de se implementar" ou "exige ou não hardware específico" ou "mais fácil de se administrar".
Novamente, indicar qual é a melhor solução depende de diversos aspectos, como tecnologia, orçamento, usabilidade, licenciamento, tempo de downtime aceitável (99.99% ou 99.999%) e uma série de outros fatores específicos de cada cenário.
***
Ainda ficou com alguma dúvida? Você pode ver tudo o que o eu já escrevi no iMasters, acompanhar o DatabaseCast– o podcast brasileiro sobre banco de dados, e ainda me seguir no Twitter @pichiliani.
Até a próxima!











2 Comentários
Qual a sua opinião?