Construindo com padrões: o padrão polimórfico
Avalie esse Artigo
Uma pergunta frequente quando se trata do MongoDB é: "Como faço para estruturar o esquema do meu aplicativo no MongoDB? "A resposta honesta é: depende. Seu aplicativo faz mais leituras do que gravações? Quais dados precisam estar juntos quando lidos no banco de dados? Quais considerações de desempenho existem? Qual é o tamanho dos documentos? Qual será o tamanho deles? Como você prevê que seus dados cresçam e sejam dimensionados?
Todas essas perguntas e outras influenciam a maneira como um esquema de banco de dados é criado no MongoDB. Já foi dito que o MongoDB não tem esquema. Na verdade, o projeto do esquema é muito importante no MongoDB. O fato é que a maioria dos problemas de desempenho que encontramos remontam a um projeto de esquema inadequado.
Ao longo da série Criando com padrões, daremos uma olhada em doze padrões comuns de projetos de esquemas que funcionam bem no MongoDB. Esperemos que esta série estabeleça uma metodologia e um vocabulário comuns que você possa usar ao projetar esquemas. O uso desses padrões permite o uso de "blocos de construção" no planejamento de esquemas, resultando no uso de mais metodologia do que arte.
O MongoDB usa um modelo de dados de documentos. Esse modelo é inerentemente flexível, permitindo que os modelos de dados suportem suas necessidades de aplicativos. A flexibilidade também pode fazer com que os esquemas sejam mais complexos do que deveriam. Ao pensar em projeto de esquemas, devemos pensar em desempenho, escalabilidade e simplicidade.
Vamos começar nossa exploração do projeto de esquema dando uma olhada no que pode ser considerado a base para todos os padrões, o Padrão Polimórfico. Esse padrão é utilizado quando temos documentos que possuem mais semelhanças do que diferenças. Também é uma boa opção quando queremos manter documento em uma única coleção.
Quando todos os documentos em uma coleção têm estrutura semelhante, mas não idêntica, chamamos isso de Padrão Polimórfico. Conforme mencionado, o Padrão Polimórfico é útil quando queremos acessar informações de uma única coleção. O agrupamento de documentos com base nas consultas que queremos executar (em vez de separar o objeto em tabelas ou coleções) ajuda a melhorar o desempenho.
Imagine que nosso aplicativo rastreie atletas profissionais de todos os esportes.
Ainda queremos poder acessar todos os atletas em nosso aplicativo, mas os atributos de cada atleta são muito diferentes. É aqui que o Padrão Polimórfico aparece. No exemplo abaixo, armazenamos dados de atletas de dois esportes diferentes na mesma coleção. Os dados armazenados sobre cada atleta não precisam ser os mesmos, mesmo que os documentos estejam na mesma coleção.
Os registros dos atletas profissionais têm algumas semelhanças, mas também algumas diferenças. Com o Padrão Polimórfico, conseguimos facilmente acomodar essas diferenças. Se não estivéssemos usando o Padrão Polimórfico, provavelmente teríamos uma coleção para atletas de boliche e uma coleção para atletas de tênis. Quando quiséssemos consultar todos os atletas, precisaríamos fazer uma junção demorada e potencialmente complexa. Em vez disso, como estamos usando o Padrão Polimórfico, todos os nossos dados são armazenados em uma coleção Atletas e a consulta a todos os atletas pode ser realizada com uma query simples.
Esse padrão de projeto também pode ser aplicado a subdocumentos incorporados. No exemplo acima, Martina Navratilova não competiu apenas sozinha de forma individual, então podemos estruturar seu registro da seguinte maneira:
Do ponto de vista do desenvolvimento de aplicativos, ao usar o Padrão Polimórfico, examinaremos campos específicos no documento ou subdocumento para poder rastrear as diferenças. Saberíamos, por exemplo, que um tenista pode estar envolvido em diferentes eventos, ao passo que o jogador de outro esporte pode não estar. Isso, normalmente, exigirá caminhos de código diferentes no código do aplicativo com base nas informações de um determinado documento. Ou, talvez, diferentes classes ou subclasses sejam escritas para lidar com as diferenças entre jogadores de tênis, boliche, futebol e rúgbi.
Um exemplo de caso de uso do padrão polimórfico são os aplicativos de visualização única. Imagine trabalhar para uma empresa que, com o passar do tempo, adquire outras empresas com seus padrões de tecnologia e dados. Por exemplo, cada empresa tem vários bancos de dados, cada um modelando "seguro com seus clientes". Então você compra essas empresas e quer integrar todos esses sistemas em um. Mesclar esses diferentes sistemas em um esquema SQL unificado é caro e leva tempo.
A MetLife conseguiu usar o MongoDB e o padrão polimórfico para criar seu aplicativo de visualização única em alguns meses. O aplicativo de visualização única agrega dados de várias fontes em um repositório central, permitindo que o atendimento ao cliente, os representantes de seguro, o faturamento e outros departamentos tenham uma visão completa de um cliente. Assim eles podem oferecer um serviço de atendimento ao cliente melhor a um custo reduzido para a empresa. Além disso, usando o modelo de dados flexível do MongoDB e o padrão polimórfico, a equipe de desenvolvimento conseguiu inovar rapidamente para colocar o produto online.
Um aplicativo de visualização única é um caso de uso do padrão polimórfico. Ele também é adequado para outros usos, como catálogos de produtos em que uma bicicleta tem atributos diferentes de uma vara de pesca. Nosso exemplo de atleta poderia ser facilmente expandido para um sistema de gerenciamento de conteúdo mais completo e utilizar o padrão polimórfico.
O Padrão Polimórfico é usado quando os documentos têm mais similaridades do que diferenças. Os casos de uso típicos para esse tipo de projeto de esquema seriam:
- Aplicativos de visualização individual
- Gerenciamento de conteúdo
- Aplicativos móveis
- Um catálogo de produtos
O padrão polimórfico apresenta um design fácil de implementar que permite queries em uma coleção específica e é um ponto de partida para muitos dos padrões de projeto que veremos nas próximas publicações. O próximo padrão que abordaremos é o Padrão de atributos.