Mapeamento objeto-relacional - Object–relational mapping

O mapeamento objeto-relacional ( ORM , O / RM e ferramenta de mapeamento O / R ) em ciência da computação é uma técnica de programação para converter dados entre sistemas de tipos incompatíveis usando linguagens de programação orientadas a objetos. Isso cria, com efeito, um " banco de dados de objetos virtuais " que pode ser usado de dentro da linguagem de programação. Existem pacotes gratuitos e comerciais disponíveis que realizam mapeamento objeto-relacional, embora alguns programadores optem por construir suas próprias ferramentas ORM.

Na programação orientada a objetos , as tarefas de gerenciamento de dados atuam em objetos que quase sempre são valores não escalares . Por exemplo, considere uma entrada do catálogo de endereços que representa uma única pessoa com zero ou mais números de telefone e zero ou mais endereços. Isso poderia ser modelado em uma implementação orientada a objetos por um " objeto Person " com um atributo / campo para conter cada item de dados que a entrada compreende: o nome da pessoa, uma lista de números de telefone e uma lista de endereços. A própria lista de números de telefone conteria "objetos PhoneNumber" e assim por diante. Cada entrada do catálogo de endereços é tratada como um único objeto pela linguagem de programação (ela pode ser referenciada por uma única variável contendo um ponteiro para o objeto, por exemplo). Vários métodos podem ser associados ao objeto, como métodos para retornar o número de telefone preferido, o endereço residencial e assim por diante.

Por outro lado, muitos produtos de banco de dados populares, como sistemas de gerenciamento de banco de dados SQL (DBMS), não são orientados a objetos e só podem armazenar e manipular valores escalares , como inteiros e strings organizados em tabelas . O programador deve converter os valores do objeto em grupos de valores mais simples para armazenamento no banco de dados (e convertê-los de volta na recuperação) ou usar apenas valores escalares simples dentro do programa. O mapeamento objeto-relacional implementa a primeira abordagem.

O cerne do problema envolve traduzir a representação lógica dos objetos em uma forma atomizada que seja capaz de ser armazenada no banco de dados enquanto preserva as propriedades dos objetos e seus relacionamentos para que eles possam ser recarregados como objetos quando necessário. Se essa funcionalidade de armazenamento e recuperação for implementada, os objetos serão considerados persistentes .

Visão geral

Os detalhes específicos de implementação dos drivers de armazenamento geralmente são incluídos em uma API na linguagem de programação em uso, expondo métodos para interagir com o meio de armazenamento de uma forma mais simples e mais alinhada com os paradigmas do código circundante.

A seguir está um exemplo simples, escrito em código C # , para executar uma consulta escrita em SQL usando um mecanismo de banco de dados.

var sql = "SELECT id, first_name, last_name, phone, birth_date, sex, age FROM persons WHERE id = 10";
var result = context.Persons.FromSqlRaw(sql).ToList();
var name = result[0]["first_name"];

Em contraste, o seguinte faz uso de uma API de trabalho ORM, permitindo a escrita de código que naturalmente faz uso dos recursos da linguagem.

var person = repository.GetPerson(10);
var firstName = person.GetFirstName();

O caso acima faz uso de um objeto que representa o repositório de armazenamento e métodos desse objeto. Outras estruturas podem fornecer código como métodos estáticos, como a seguir, e ainda outros métodos podem não implementar um sistema orientado a objetos. Freqüentemente, a escolha do paradigma é feita para se adequar melhor ao ORM aos princípios de design da linguagem circundante.

var person = Person.Get(10);

Normalmente, a estrutura irá expor alguma funcionalidade de filtragem e consulta, permitindo que subconjuntos da base de armazenamento sejam acessados ​​e modificados. O código abaixo consulta as pessoas no banco de dados cujo valor de ID é '10'.

var person = Person.Get(Person.Properties.Id == 10);

Comparação com técnicas tradicionais de acesso a dados

Comparado às técnicas tradicionais de troca entre uma linguagem orientada a objetos e um banco de dados relacional, o ORM geralmente reduz a quantidade de código que precisa ser escrito.

As desvantagens das ferramentas ORM geralmente se originam do alto nível de abstração que obscurece o que está realmente acontecendo no código de implementação. Além disso, a forte dependência do software ORM foi citada como um fator importante na produção de bancos de dados mal projetados.

Bancos de dados orientados a objetos

Outra abordagem é usar um sistema de gerenciamento de banco de dados orientado a objetos (OODBMS) ou bancos de dados orientados a documentos , como bancos de dados XML nativos, que fornecem mais flexibilidade na modelagem de dados. OODBMSs são bancos de dados projetados especificamente para trabalhar com valores orientados a objetos. Usar um OODBMS elimina a necessidade de converter dados de e para seu formato SQL, pois os dados são armazenados em sua representação de objeto original e os relacionamentos são representados diretamente, em vez de exigir tabelas / operações de junção . O equivalente de ORMs para bancos de dados orientados a documentos são chamados de mapeadores de documentos de objetos (ODMs).

Os bancos de dados orientados a documentos também evitam que o usuário tenha que "fragmentar" objetos em linhas da tabela. Muitos desses sistemas também suportam a linguagem de consulta XQuery para recuperar conjuntos de dados.

Bancos de dados orientados a objetos tendem a ser usados ​​em aplicativos de nicho complexos. Um dos argumentos contra o uso de um OODBMS é que ele pode não ser capaz de executar consultas ad-hoc, independentes de aplicativos. Por esse motivo, muitos programadores se sentem mais à vontade com um sistema de mapeamento SQL de objetos, embora a maioria dos bancos de dados orientados a objetos sejam capazes de processar consultas SQL em uma extensão limitada. Outros OODBMS fornecem replicação para bancos de dados SQL, como um meio de abordar a necessidade de consultas ad-hoc, preservando padrões de consulta bem conhecidos.

Desafios

Uma variedade de dificuldades surge ao considerar como combinar um sistema de objetos a um banco de dados relacional. Essas dificuldades são conhecidas como incompatibilidade de impedância objeto-relacional .

Uma alternativa para implementar ORM é o uso das linguagens procedurais nativas fornecidas com todos os principais bancos de dados. Eles podem ser chamados a partir do cliente usando instruções SQL. O padrão de design Data Access Object (DAO) é usado para abstrair essas instruções e oferecer uma interface orientada a objetos leve para o resto do aplicativo.

Veja também

Referências

links externos