Base de dados para um Software Modularizado
Tags: go, postgres, softwareengineering
Published: 2024-01-03 12:26:45



## Definições Relacionadas
**Software Modularizado:** É um software que é dividido em módulos independentes, cada um com uma função específica.

**Schema da Base de dados:** É um conjunto de objectos de banco de dados, como tabelas, views, triggers e funções, que são organizados de forma lógica.

## Equivalência entre Módulo e Schema
Em sistemas complexos, a organização da base de dados é crucial para facilitar o acesso aos dados. Dada a presença de inúmeras tabelas, é fundamental reconhecer que cada uma está vinculada a um domínio específico da aplicação. 
Uma abordagem viável é aproveitar o conceito de módulos e integrá-lo à estrutura oferecida pela base de dados. Nesse contexto, a opção adequada para representar os módulos é a utilização de Schemas.
Neste contexto, a estrutura fudamental segue as directrizes:
- Cada módulo é representado por um schema na base de dados.
- Cada schema contém seus próprios objectos, como views, tabelas, triggers e functions.
- Ao construir queries complexas, é crucial considerar o schema onde a tabela está localizada.


## Passos para criar uma Base de Dados Modularizada
Para criar uma base de dados para um sistema modular, podemos seguir os seguintes passos:
- Criar um banco de dados.
- Criar os schemas necessários.
- Criar as tabelas, views, triggers e funções em cada schema.
- Se necessário, definir as regras de acesso específicas para cada schema.

## Vantagens dos Schemas 
- **Organização:** Ajudam a organizar a base de dados de forma lógica, facilitando o entendimento e o gerenciamento.
- **Modularização da Base de Dados:** Permitem que a base de dados seja dividida em módulos independentes, cada um com uma função específica.
- **Separação de Responsabilidades:** Ajudam a separar as responsabilidades entre os diferentes módulos do software.
- **Navegabilidade:** Facilitam a navegação pela base de dados, pois permitem que as tabelas sejam agrupadas por domínio. A partir do nome do _Schema_, é possível saber o domínio.
- **Reusabilidade de Código:** Funcionalidades específicas podem ser encapsuladas em módulos separados, permitindo que esses módulos sejam reutilizados em diferentes partes do sistema ou em projetos futuros.
- **Segurança Aprimorada:** Controles de acesso e permissões podem ser mais facilmente aplicados a módulos específicos, garantindo que apenas usuários autorizados tenham acesso a determinadas partes da base de dados.
- **Aprimoramento na Colaboração:** Diferentes equipas podem se concentrar em módulos específicos sem interferir nas actividades umas das outras.

## Desafios na Criação de Schemas
- **Complexidade nas Consultas:** Quando se trata de reunir dados de vários módulos, a intersecção de diferentes Schemas pode exigir um entendimento aprofundado da estrutura da base de dados.
- **Verbosidade no Código:** Ao construir consultas que referenciam objectos de diferentes schemas, podem aumentar a quantidade de código, tornando-o mais extenso.
- **Manutenção da Consistência entre módulos:** Mudanças em um schema podem exigir ajustes em vários pontos do código. A sincronização entre os módulos é crucial para evitar inconsistências nos dados.
- **Padronização e Consistência na Nomenclatura:** Garantir a padronização na nomenclatura dos objectos em diferentes Schemas pode ser desafiador, visto que a manutenção de uma convenção consistente é crucial para evitar confusões e erros.
- **Treinamento da Equipa:** Pode exigir treinamento adicional para a equipa. A falta de compreensão sobre a estrutura modular pode resultar em erros de implementação e manutenção.

## Conclusão
Recomenda-se aos desenvolvedores dedicarem tempo no estudo da linguagem **SQL**, incluindo a nomenclatura de schemas, tabelas de modo consistente, ajudando na navegabilidade da base de dados.

## Exemplo
Criação da base de dados para um sistema modular usando PostgreSQL. O nome da base de dados será **golang_modular_software**.
Inicialmente,  vamos criar uma base de dados com quatro schemas:
- **configurations:** Para armazenar as configurações do sistema.
- **authentication:** Para armazenar os dados de autenticação dos usuários.
- **human_resources:** Para armazenar os dados dos funcionários da empresa.
- **customers:** Para armazenar os dados dos clientes da empresa.

**Código fonte:** https://github.com/ortizdavid/golang-modular-software.



![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6y39di025odgj9fhgpyw.jpg)


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


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


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


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

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


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