đ§đ· Porque armazenar Agregados com NoSQL ?
Com o movimento recente no uso de bancos de dados nĂŁo relacionais, muitas opçÔes de armazenamento de dados ficaram em evidĂȘncia deixando o ambiente um tanto confuso ao decidir o que usar.
Decidir qual melhor forma de armazenar o estado de seus agregados e entidades sempre dependerå da necessidade do projeto, mas não podemos ficar distantes de sempre pensar na melhor opção e balancear os prós e contras.
Gostaria de deixar uma reflexĂŁo sobre o uso NoSQL e a persistĂȘncia de Aggregates, talvez ela possa ajudar na decisĂŁo da sua arquitetura.
Para nivelarmos os conceitos, segundo Martin Fowler, um agregado Ă© agrupador de objetos do domĂnio, que podem ser tratados como uma unidade.
Quero iniciar a reflexĂŁo com a persistĂȘncia de bancos de dados relacionais, ressaltando que vocĂȘ terĂĄ que diluir o seu modelo de negĂłcios em tabelas, colunas e relacionamentos. Com esse tipo de persistĂȘncia, vocĂȘ sempre terĂĄ um esforço de infraestrutura para realizar a conversĂŁo entre um linhas de um banco de dados e os objetos do seu domĂnio, mesmo que vocĂȘ faça o uso de um ORM. TambĂ©m Ă© muito comum fazer o uso de design patterns para transformar os seus dados em um objeto relevante no seu domĂnio, como Ă© o caso do Factory.
Abaixo segue uma imagem do Marin Fowler que ilustra muito bem essa complexidade.
Com isso conseguimos levantar trĂȘs passos para modelar um sistema com base de dados relacional: Criar tabelas e relacionamentos, definir a estratĂ©gia de recuperar os dados persistidos, definir estratĂ©gia de conversĂŁo do modelo relacional para o seu modelo de domĂnio.
Por outro lado, bancos de dados NoSQL oferecem uma forma mais livre e maleĂĄvel de armazenar e recuperar seus dados, devido a sua simplicidade de armazenamento em chave/valor.
Existem vårios produtos no mercado que implementam essa ideia, com pequenas variaçÔes, mas todos compartilham o mesmo conceito: Armazenamento de documentos (geralmente JSON) identificados por uma chave.
Esse modelo é ótimo para aplicaçÔes pois o armazenamento/recuperação dos dados é feita de forma nativa na maioria das linguagens, serializando o estado do agregado em JSON e convertendo de JSON para objetos.
Outro aspecto importante dessa abordagem Ă© a escalabilidade proporcionada ao seu negĂłcio, devido o modelo de armazenamento que pode ser distribuĂdo em clusters de processamento. A IBM tem um Ăłtimo artigo bem detalhado sobre esse aspecto, incluindo vĂĄrios players do mercado, que pode tambĂ©m ajudar a uma decisĂŁo no seu modelo.
Os efeitos colaterais desse modelo estĂŁo na forma de leitura desse dado, pois se olharmos para uma coleção de âPedidos de Vendasâ e precisarmos saber todos os pedidos em um determinado dia, ou todos os pedidos com valor total maior do que US$ 100, nĂŁo terĂamos uma chave bem definida para tais consultas e acabarĂamos esbarrando em um âfull table scanâ nas consultas.
O exemplo dado acima, mostra perguntas analĂticas em cima dos dados, nesse caso, tais perguntas podem ser respondidas atravĂ©s de uma base de dados analĂtica, usando Data Warehouses. Para o lado transacional, apenas ficariam açÔes transacionais, tais como, recuperar um pedido de venda, mudar o status, cancelar, etc.
Em fim, parece bem razoĂĄvel o uso de NoSQL para guardar o estado dos seus agregados, devido ao baixo custo de manutenção, escalabilidade, facilidade de implementação. A Ășnica restrição estĂĄ na forma em que vocĂȘ vai formular as perguntas ao seu modelo de dados.
Se hĂĄ algum lado que nĂŁo foi coberto nessa reflexĂŁo e que vocĂȘ acha importante compartilhar, por favor, deixe um comentĂĄrio contribuindo para a discussĂŁo.
Esse artigo tambĂ©m estĂĄ disponĂvel em InglĂȘs.