PostgreSQL é um sistema de gerenciamento de banco de dados relacional e objeto-relacional (ORDBMS) de código aberto. Ele é conhecido por sua robustez, extensibilidade e conformidade com os padrões SQL. Foi desenvolvido para ser altamente escalável, suportando grandes volumes de dados e usuários simultâneos.
- Conformidade com SQL: PostgreSQL é altamente compatível com o padrão SQL, garantindo portabilidade e facilidade de uso.
- Extensibilidade: Permite a criação de tipos de dados personalizados, funções e operadores, oferecendo grande flexibilidade.
- Desempenho e Escalabilidade: Suporta consultas complexas e grandes volumes de dados com eficiência.
- Segurança: Oferece recursos avançados de segurança, como autenticação baseada em roles, SSL, e controle de acesso granular.
- Transações ACID: Garantia de integridade e consistência dos dados através de transações completas com Atomicidade, Consistência, Isolamento e Durabilidade.
- Comunidade Ativa: Um grande número de desenvolvedores e documentação disponível, facilitando a resolução de problemas e o aprendizado.
- JDBC (Java Database Connectivity): O PostgreSQL possui drivers JDBC robustos, permitindo uma integração suave com aplicações Java.
- ORMs (Object-Relational Mappers): Ferramentas como Hibernate e JPA (Java Persistence API) funcionam muito bem com PostgreSQL, facilitando o mapeamento objeto-relacional e reduzindo a complexidade do código.
- Multiplataforma: Tanto PostgreSQL quanto Java são multiplataforma, permitindo a criação de aplicações portáveis e independentes de sistema operacional.
- Desempenho: A combinação de PostgreSQL com Java permite a criação de aplicações de alto desempenho, aproveitando o melhor das capacidades de gerenciamento de dados de PostgreSQL e a eficiência da JVM (Java Virtual Machine).
- Ferramentas de Desenvolvimento: Existem várias ferramentas de desenvolvimento e bibliotecas em Java que oferecem suporte direto para PostgreSQL, melhorando a produtividade do desenvolvedor.
- Escalabilidade e Manutenção: Aplicações em Java com PostgreSQL são fáceis de escalar e manter, graças à robustez e confiabilidade de ambos.
O modelo de dados procura ser uma representação das entidades de domínio para esse sistema, de modo a suportar as seguintes funcionalidades e operações de leitura e escrita:
- Pedido: realizar pedido, acompanhar pedido, pagamento, acompanhamento e entrega
- Gerenciamento de Clientes
- Gerenciamento de Produtos e Categorias
Abaixo uma breve documentação das tabelas do sistema, com base no diagrama de entidade relacionamento evidenciado:
- Gerenciamento de clientes é identificado basicamente pela tabela customer: customer: contem informações dos clientes do sistema. O principal campo desta tabela é document que possui uma constraint unique, ou seja, permite armazena o campo cpf do cliente como sendo único, isto é, não permitindo duplicação do mesmo. Possui relação com tabela order_request (tabela responsável pelos pedidos) através da coluna id_customer. Esta relação é do tipo nullable, permitindo que um pedido seja aberto sem a obrigatoriedade de identificação do cliente
- Gerenciamento de categorias e produtos: Representado pelas tabelas: product (armazena informações dos produtos disponíveis no sistema, como name, description, price e id_category) e category (category define as categorias para agrupar os produtos). Produto se relaciona com category através da coluna id_category
- Pedido:
- order_request registra os pedidos realizados pelos clientes. Possui relação com customer e item
- item: contém informações dos itens associados a um pedido, como id_product, quantity, total e unit_value. Possui relacionamento com tabelas order_request e product.
- order_payment: registra pagamentos associados a pedidos. Possui relacionamento com order_request
- Foi realizada uma analise das principais consultas usadas pela aplicação, com base nas informações abaixo, foi verificado que as tabelas abaixo e suas respectivas colunas poderiam ser agregados índices para melhorar sua performance, visando que o sistema possa ser mais escalável, e consiga comportar mais dados no decorrer do tempo, sem comprometer a performance e experiência do usuário.
- Os campos do tipo uuid já são criados de forma indexada pelo próprio postgres. Os demais campos foi criada uma migration com a criação desses índices.
Tabela | Colunas |
---|---|
category | name, uuid |
product | name, uuid |
customer | uuid, document |
order_request | uuid, status |
- Script migration com a criação dos índices:
set schema 'public';
create index category_index_name on public.category (name);
create index customer_index_document on public.customer (document);
create index order_request_index_status on public.order_request (status);
create index product_index_name on public.product (name);
Este repositório contém arquivos Terraform para provisionar e gerenciar recursos na AWS. Abaixo está uma explicação de cada arquivo:
O arquivo main.tf
é o ponto de entrada para a configuração do Terraform. Ele configura a configuração geral, inicializa o provedor e integra todos os módulos de recursos.
- Define o provedor AWS e sua configuração (ex.: região).
- Chama módulos individuais de recursos (como RDS e grupos de segurança).
Trecho de Código:
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "5.75.1"
}
}
backend "s3" {
bucket = "bucket-tf-state-fiap-team-32"
key = "rds/terraf...
Este arquivo é responsável por provisionar uma instância de banco de dados Amazon RDS.
- Configura o tipo de instância de banco de dados (ex.:
db.t3.micro
). - Especifica o armazenamento, tipo de engine (ex.: MySQL ou PostgreSQL) e versão.
- Integra-se com o grupo de segurança definido em
sg-database.tf
para controle de acesso.
Trecho de Código:
resource "aws_db_instance" "db-tc-backends3" {
identifier = "db-tc-backends3"
engine = "postgres"
engine_version = "16.3"
instance_class = var.instance_type
a...
Este arquivo cria um grupo de segurança para controlar o acesso à instância RDS.
- Define regras de entrada e saída para restringir ou permitir tráfego específico.
- Garante que apenas fontes confiáveis possam acessar o banco de dados.
Trecho de Código:
resource "aws_security_group" "security-group-database" {
name = "security-group-database"
description = "Security Group Database"
ingress {
from_port = 5432
to_port = 5432...
Este arquivo centraliza as variáveis usadas na configuração do Terraform.
- Define variáveis para configurações reutilizáveis, como tipo de instância de banco de dados, armazenamento alocado e região.
- Ajuda a gerenciar configurações específicas do ambiente (ex.: dev, staging, produção).
Trecho de Código:
variable "db_username" {
description = "DB Username"
type = string
default = "postgres"
}
variable "db_password" {
description = "DB Password"
type = string
sensitive ...
-
Certifique-se de ter o Terraform instalado no seu sistema local.
-
Configure suas credenciais AWS usando o AWS CLI ou variáveis de ambiente.
-
Inicialize o diretório de trabalho do Terraform:
terraform init
-
Valide os arquivos de configuração:
terraform validate
-
Aplique a configuração para provisionar os recursos:
terraform apply
-
Destrua os recursos quando eles não forem mais necessários:
terraform destroy
- Certifique-se de atualizar as variáveis em
vars.tf
com os detalhes específicos do seu ambiente. - Garanta que as permissões apropriadas do IAM estejam disponíveis para executar os comandos do Terraform.