# 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