# PDIS Preliminar Presentation ###### tags: `PDIS` ## Introdução & Contexto O tema da minha dissertação é "Ferramenta para gestão incremental de modelos de base de dados", e foi proposto pela Cloudware S.A. Para um pouco de contexto, a Cloudware é uma empresa que desenvolve software de Gestão e Contabilidade, que alojam neste momento cerca de 120.000 empresas ativas. Estas empresas encontram-se distríbuidas por múltiplas bases de dados, e cada empresa tem o seu esquema independente. Esta abordagem é essencial para que os serviços sejam eficazes e rentáveis, pois evita por exemplo a criação de tabelas de grande dimensão, que acabam por se tornar ineficientes, mesmo quando indexadas. ## Problema e Motivação Com a infraestrutura atual, o esquema de base de dados de cada empresa é comum, e é necessário que qualquer alteração feita seja refletida em todas as empresas (ou seja uma migração da base de dados tem que ser executada em todos os esquemas individuais). Para tal, a Cloudware utiliza hoje em dia 2 ferramentas: * **dbmate** para projetos de menor dimensão. O dbmate permite criar migrações em ficheiros SQL, no entanto não permite correr migrações em esquemas diferentes. Por este motivo, é apenas usado em bases de dados menores, e não para atualizar os esquemas independentes de cada empresa. * **ActiveRecord** (de Ruby on Rails) para projetos de maior dimensão. Para quem não conhece Ruby on Rails, é uma framework para Ruby que segue a abordagem Model-View-Controller, em que o ActiveRecord corresponde ao Model, responsável pela lógica de negócio. Uma migração em ActiveRecord corresponde a um ficheiro Ruby que por sua vez corre código SQL, e que permite executar a migração de todos os esquemas individuais, algo que o dbmate não permite. Para criar uma migração para ambas estas ferramentas, normalmente é necessário criar 2 métodos: o **up** e o **down**. O **up** irá conter o código da alteração que queremos fazer (como inserir colunas ou tabelas por exemplo) e o **down** contem código para reverter dita alteração (continuando com o exemplo, o down irá remover as colunas ou tabelas novas). Este processo de criação de migrações é manual, trabalhoso e sujeito a erros, em particular o método down. Visto que para reverter alterações, é preciso considerar vários fatores, entre eles a ordem de operações executadas no método up. ## Objetivos e Resultados esperados Portanto o trabalho que vou realizar visa criar uma ferramenta que capaz de: * Permitir a developers fazer alterações ao modelo lógico sem ter de manualmente fazer código para refletir essas alterações em todos os esquemas independentes * Permitir aos utilizadores expandirem o modelo lógico, usando por exemplo estruturas JSON * Continuar a permitir alterações comuns a todas as empresas, preservando eventuais expansões já feitas pelos utilizadores * Integrar os conceitos de migração de bases de dados com controlo de versões Este último ponto será por sua vez sub-dividido em 2 objetivos menores: * Numa primeira iteração, o foco será apenas sobre migrações de funções e stored procedures, pois este é o tipo de migração mais comum, e também o mais fácil de analisar * Numa segunda iteração, o foco passará para migrações que fazem alterações a tabelas ou até criam tabelas novas, visto que estas alterações são mais sensíveis e complexas de reverter Estas funcionalidades irão ser validadas no ambiente de desenvolvimento da Cloudware, para avaliar a viabilidade da sua integração nos processos de produção. ## Estado da arte Para terminar vou falar um pouco sobre o estado da arte. Como é óbvio, já existem ferramentas no mercado capazes de resolver alguns dos problemas mencionados. As ferramentas usadas hoje em dia pela Cloudware foram escolhidas por alguns motivos: * **ActiveRecord** é utilizado visto que o backend dos projetos é maioritariamente em Ruby on Rails (e permite executar migrações em todos os esquemas individuais) * **dbmate** é utilizado por ser agnóstico ao backend utilizado, no entanto não possui todas as capacidades do ActiveRecord Uma possível alternativa já identificada é o **Obevo**. Obevo é uma ferramenta que já integra os conceitos de migração de bases de dados com controlo de versões, e gera automaticamente os métodos up e down para migrações de funções e stored procedures, por exemplo. No entanto não tem capacidade de gerar migrações para esquemas independentes, por isso não cumpre todas as necessidades da Cloudware, mas poderá servir de base à ferramenta que vou desenvolver. E com isto termino a minha apresentação