Como inicializar uma base de dados para um Sistema Modularizado?
Tags: postgres, go, softwareengineering, software
Published: 2024-01-22 08:31:14

## Definições Relacionadas
**- Inicialização da base de dados:** Processo de criar e configurar a estrutura necessária na base de dados para suportar a aplicação. Isso inclui a criação de tabelas, views, procedures, triggers e outros objetos necessários para o funcionamento do sistema.
**- Script da base de dados:** Conjunto de instruções SQL que define e manipula a estrutura da base de dados. Podem conter comandos para criar tabelas, definir índices, inserir dados de exemplo e realizar outras operações necessárias.
**- Objectos da base de dados:** Entidades na base de dados, como tabelas, views, triggers e procedures que são usadas para armazenar e manipular dados.
**- Transações:** Unidades lógicas de trabalho numa base de dados. Garantem que um conjunto de operações sejam executadas com sucesso como uma única unidade, ou sejam completamente revertidas.
**- Schema:** Colecção de objectos de banco de dados, incluindo tabelas, views, stored procedures, etc. Ele serve para organizar e agrupar esses objectos.
**- Módulo:** Parte distinta e isolada da aplicação, frequentemente associada a um conjunto específico de funcionalidades.

## Cenário no Contexto de um Sistema Modularizado
Em um sistema modular, é uma prática comum organizar diversos elementos, por meio de **Schemas**. Cada Schema actua como uma unidade que agrupa objectos relacionados a um módulo específico do sistema. Conforme o software evolui, a quantidade de tabelas aumenta, o que por sua vez aumenta a complexidade na administração dos scripts da base de dados.
O principal desafio neste cenário está na **inicialização dos scripts** da base de dados, pois para cada módulo, é necessário lidar com múltiplos scripts. A etapa de inicialização envolve não apenas a criação dos Schemas, mas também a inclusão dos scripts associados a cada Schema. A complexidade aumenta exponencialmente à medida que o número de módulos e, consequentemente, de scripts, cresce.
A **inicialização manual** da base de dados torna-se extremamente desafiadora quando há uma grande quantidade de módulos, considerando que cada módulo pode ter múltiplos scripts associados. A escalabilidade do software resulta em uma crescente complexidade na gestão dos processos de inicialização.
Para enfrentar a **complexidade estrutural** durante a inicialização da base de dados, é recomendado adoptar um método adequado, alinhado à familiaridade e preferências da equipa de desenvolvimento. Existem abordagens tanto automatizadas quanto manuais, cada uma oferecendo benefícios específicos.

## Métodos para Inicializar uma Base de Bados
**- Cópia manual dos Scripts para a base de dados:** Criando scripts SQL ou outro formato compatível e executá-los manualmente no console de gerenciamento do banco de dados.
**- Scripts de CLI (Bash ou PowerShell):**  Utilizando scripts da linha de comandos para automatizar o processo de inicialização. Isso pode incluir a execução de comandos SQL ou a chamada de utilitários específicos da base de dados.
**- Scripts Python:** Desenvolvendo scripts em Python para manipular a inicialização da base de dados, aproveitando a facilidade da linguagem.
**- Migrations:** Utilizando frameworks de migração oferecidas pela linguagem de programação. Migrations permitem gerenciar alterações no esquema do banco de dados de forma estruturada ao longo do tempo.
**- Funções usando a linguagem de implementação:** Implementando funções específicas na linguagem de programação principal do sistema. Por exemplo, usando funções Golang para criar tabelas, estabelecer índices e realizar outras operações de inicialização.
**- Ferramentas dedicadas:** Utilizando ferramentas especializadas, projetadas para gerenciar migrações e inicialização de bancos de dados de maneira eficiente e controlada. Essas ferramentas muitas vezes oferecem recursos avançados, como versionamento automático e rollback. Ex: Flyway e Liquibase.

## Método adoptado para inicialização
Neste artigo, direcionaremos nossa atenção para a inicialização por meio da implementação de funções utilizando a linguagem Golang. Essa abordagem concede-nos o controle da execução dos scripts, a capacidade de definir a ordem de execução, maior flexibilidade para incorporar operações e, se necessário, utilizar transações na base de dados.

## Passos para a Inicialização
- Inclusão dos scripts da base dados num directório do projecto (Ex: /database).
- Organização da base de dados em Schemas (representando os módulos).
- Ler os scripts a partir desse directório.
- Executar cada script, adoptando o conceito de transações.
- Mostrar os resultados de cada processamento.

## Vantagens da utilização
**- Versionamento dos scripts:** Os scripts podem ser versionados usando um sistema de controle de versão, o que facilita o gerenciamento das mudanças.
**- Incialização dos scripts desejados:** Os scripts podem ser selecionados para inicialização, o que permite inicializar apenas os scripts necessários.
**- Controle da ordem de execução:** A ordem de execução dos scripts pode ser controlada, o que garante que a base de dados seja inicializada corretamente.
´

## Desafios dessa abordagem
**- Manutenção da Consistência:** Garantir que os scripts ou as operações de inicialização estejam consistentes ao longo do tempo, especialmente em sistemas complexos com diversas versões e ambientes.
**- Controle de Versão:** Gerenciar efetivamente as versões dos scripts ou migrações para evitar conflitos e garantir que a base de dados esteja alinhada com a versão do código-fonte.
**- Gerenciamento de Erros:** Lidar com erros durante o processo de inicialização, garantindo que falhas não comprometam a integridade da base de dados e possam ser corrigidas de maneira eficiente.
**- Desafios de Escala:** À medida que a aplicação cresce, a inicialização do banco de dados pode se tornar mais complexa. Manter a eficiência e o desempenho durante esse processo é crucial.


## Sugestões
**- Automatização Contínua:** Integrar a inicialização do banco de dados nos processos de integração contínua para garantir que as alterações no código e no esquema do banco de dados sejam refletidas automaticamente.
**- Documentação Detalhada:** Manter documentação detalhada dos scripts, migrações ou funções de inicialização para facilitar a compreensão e a resolução de problemas futuros.
**- Testes Adequados:** Implementar testes rigorosos para os scripts de inicialização, migrações e operações no banco de dados, garantindo que as alterações sejam testadas antes de serem aplicadas em ambientes de produção.
**- Controle de Acesso: **Garantir que apenas usuários autorizados tenham permissão para executar operações de inicialização e que as credenciais necessárias sejam gerenciadas de forma segura.


## Conclusão
A escolha da abordagem para inicialização do banco de dados depende das necessidades específicas do projeto, da equipe e da complexidade do sistema. Cada método apresenta vantagens e desafios, sendo crucial avaliar esses aspectos antes de decidir qual abordagem adotar. A integração contínua, documentação adequada e testes eficientes são fundamentais para garantir uma inicialização de banco de dados suave e confiável ao longo do ciclo de vida do projeto.

## Exemplo
Incialização de uma base de dados modularizada, usando Golang e PostgreSQL.
Código Fonte: https://github.com/ortizdavid/golang-modular-software



![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pin0wmt0893dc2vreclo.png)


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nptmk27zziwz12seh75e.png)


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hfhjjrzweuer48tvqwq5.png)


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nw2ipns4mhwrj0s0f8lj.png)


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3huqrntk2jyf6zlq4f6e.png)


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/stvm717qyizoshyapazm.png)


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9d42k74ukpt0n47qtrwf.png)


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/irtt57j7ohh11n0zymgq.png)