Revisitando a Persistência - ORM, ADO.NET Entity Framework, Data Services, Sync, LINQ e ainda outros comentários.
Olá pessoal, tudo certo?
No último post, começamos uma discussão interessante sobre persistência. Vamos rever alguns pontos e avançar mais um pouquinho. A motivação do estudo é uma só: como e por que integrar a modelagem e programação Orientada a Objetos com Bancos de Dados Relacional?
De fato, a maior parte de nossas aplicações usam um banco relacional para armazenamento de dados. Como vimos, essa tecnologia é vigente no mercado, por sua maturidade, fundamentação em uma teoria matemática forte (baseada em conjuntos) e padronização. Veja que, quando usamos o modelo relacional, o objetivo é a normalização e a otimização de recursos no armazenamento de nossos dados ou coleções;
Da mesma forma, a maior parte de nossas aplicações usam linguagens de programação orientada a objetos em seu desenvolvimento. Com isso, nosso objetivo é a modelagem de processos, como a definição de comportamentos e tipos de entidades na forma de classes;
Surge assim um problema chamado "Impedance Mismatch", que é a dificuldade em realizar o mapeamento entre os dois mundos, o mundo relacional e o mundo OO.
Para esse problema, uma solução é o uso de uma camada de tradução ou ORM - Object Relational Mapping, que é responsável por esse mapeamento entre o mundo OO e o mundo relacional. Pense que o grande desejo é que essa camada de mapeamento ORM seja transparente para nossas aplicações.

Existe uma série de ferramentas no mercado que oferecem soluções implementando camadas ORM e seus recursos. Veja que a técnica de mapeamento objeto-relacional ainda precisa resolver alguns problemas de mapeamento e representação de dados entre ambos os mundos, problemas como:
- Mapeamento entre Entidade e Classe (queries X tipos)
- Herança
- Tratamento de Chaves (primárias, extrangeiras)
- Representação de Relacionamentos
- Campos Calculados
- Diferenças entre tipos SQL e linguagens de programação
- Locking e Isolation Level
- Tunning
- Caching, entre outros.
De fato, existe um impacto em banco de dados durante a implementação desses modelos ORM. Para a implementação de herança, por exemplo, temos técnicas de mapeamento horizontal, mapeamento vertical, mapeamento filtrado, que implementam abordagens diferentes para a representação da herança entre classes, através de 1 ou mais tabelas em banco.
No final, a própria decisão pelo uso de uma camada de mapeamento objeto-relacional deve ser ponderada em função de um conjunto de critérios (pessoais), como:
- Desempenho final exigido (SLA envolvido na solução);
- Frequência de Leitura x Escrita x Atualização;
- Flexibilidade e Custo de Manutenção;
- Desempenho e Redundância x Custo de Manutenção e Formas Normais;
- Consumo de Espaço x Desempenho;
- Tempo de Processamento de Consultas;
- Estilo da Aplicação;
- Integração com sistemas legados, etc.
Atualmente, temos uma série de novos frameworks disponíveis para o tratamento de acesso a dados, assim como para a construção de consultas integradas ao modelo orientado a objetos. É o caso do próprio ADO.NET Entity Framework e do LINQ, como citamos anteriormente. Porém, já existem muito outros componentes disponíveis, que você precisa conhecer. Para ajudar um pouco nesse roadmap, segue um conjunto de links interessante:
ADO.NET 2.0
Nosso ADO.NET clássico, onde encontramos as estruturas Dataset, DataReader, Datatable, DataAdapter, DbConnection, DbCommand, etc.
Ref.: http://msdn2.microsoft.com/en-us/data/aa937722.aspx
ADO.NET 3.5
Disponível com o .NET Framework 3.5, onde encontramos as versões de LINQ to Objects, LINQ to DataSets, LINQ to SQL, LINQ to XML, enfim, as implementações de LINQ - Language Integrated Quey, que permite a construção de consultas integradas ao modelo OO, para o acesso aos dados no mundo relacional ou ainda qualquer outra fonte de dados, como arquivos XML, estruturas customizadas, etc. Em linhas gerais, LINQ implementa um conjunto de mecanismos e bibliotecas para consultas de dados em memória, através de coleções.
Ref.: http://www.microsoft.com/downloads/details.aspx?FamilyID=333325fd-ae52-4e35-b531-508d977d32a6&DisplayLang=en
ADO.NET vNext
A próxima versão do ADO.NET deve encapsular um conjunto de novas ferramentas, que já estão sendo disponibilizadas em CTP e Previews para nossa discussão e alegria. Os principais componentes que já temos são:
Finalmente, outros projetos que estão também no forno são o Microsoft ASP.NET MVC Framework e o SubSonic.
- O Microsoft ASP.NET MVC Framework habilita o desenvolvimento de aplicações Web no modelo MVC - Model View Controller. Nesse modelo, a lógica da página fica na porção CONTROLLER, os objetos de HTML ficam no módulo VIEW e a lógica da aplicação fica na porção MODEL. Não está muito relacionado com o acesso a dados, mas colabora! :)
ASP.NET MVC Preview 2
Ref.: http://www.microsoft.com/downloads/details.aspx?FamilyID=38CC4CF1-773A-47E1-8125-BA3369BF54A3&displaylang=en
- O SubSonic Project, conduzido por Rob Conery, é um conjunto de ferramentas que deve gerar de forma completa a camada de acesso a dados. Ao contrário do modelo ORM, onde temos o mapeamento do mundo OO no mundo relacional, SubSonic será um gerador de código ou do modelo de classes OO, a partir do schema do banco relacional. Bonito! :)
Para saber mais, acompanhe as discussões no Codeplex, aqui:
SubSonic Codeplex
Ref.: http://www.codeplex.com/subsonic
SubSonic: 2.1 Beta 2 Available Now
Ref.: http://www.codeplex.com/subsonic/Release/ProjectReleases.aspx?ReleaseId=5636
Enfim, Vida Longa ao Blog!!!
Acho que não vai faltar assunto para os próximos meses, não acham?
Por enquanto é só! Até o próximo post e boa leitura a todos... :)
Waldemir.