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.: https://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.: https://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:
- ADO.NET Entity Framework Beta 3
Responsável pelo mapeamento objeto-relacional, através do chamado EDM - Entity Data Model. Esse modelo permite o mapeamento de classe objeto em qualquer tipo de fonte de dados (não só o modelo relacional) através de um processo de tradução implementado em 3 camadas: camada conceitual, camada lógica e camada de mapeamento. A documentação que acompanha o pacote está muito boa, vale conferir.
Ref.: https://www.microsoft.com/downloads/details.aspx?FamilyId=15DB9989-1621-444D-9B18-D1A04A21B519&displaylang=en
ADO.NET Data Services (codenome “Astoria”) => download do ASP.NET 3.5 Extensions Preview, onde temos o ASP.NET 3.5 + ADO.NET Data Services.
Permiti a publicação e navegação das informações de um banco de dados de forma online.
Ref.: https://www.microsoft.com/downloads/details.aspx?FamilyId=A9C6BC06-B894-4B11-8300-35BD2F8FC908&displaylang=enUm exemplo muito interessante de navegação via Data Services você encontra aqui.Veja que nosso velho Northwind agora pode ser navegado diretamente através de querystrings, praticamente. As aplicações são inúmeras, como integrações para aplicações AJAX, consumo via WCF, aplicações Web convencionais, etc.
Northwind - Navegando dados online via ADO.NET Data Services
Ref.: https://astoria.mslivelabs.com/OnlineServiceNorthwind.aspx
ADO.NET Sync Services v1.0
Sync Services é uma primeira parte de um framework ainda em desenvolvimento, que deve atender as aplicações que ficam parcialmente conectadas, ou seja, que demandam o uso de um cache local em tempos de desconexão, com a necessidade de uma sincronização de dados posterior com o servidor. Esses mecanismos e estruturas de persistências temporárias são o objetivo do Sync Services.Recomendo assistir um vídeo do channel9, nesse link:
Ref.: https://channel9.msdn.com/Showpost.aspx?postid=384948Para saber ainda mais, acompanhe as discussões aqui:
Ref.: https://www.danielmoth.com/Blog/2008/02/adonet-sync-services.htmlRef.: https://www.microsoft.com/downloads/details.aspx?FamilyId=75FEF59F-1B5E-49BC-A21A-9EF4F34DE6FC&displaylang=en (sync for devices)
Ref.: https://www.microsoft.com/downloads/details.aspx?&FamilyID=7849b34f-67ab-481f-a5a5-4990597b0297&DisplayLang=en (sync for desktop)
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.: https://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.: https://www.codeplex.com/subsonicSubSonic: 2.1 Beta 2 Available Now
Ref.: https://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.