Home | Escopo e Cronograma | Processo | Design/Mockups | Configuração | Arquitetura | Infra | Código | BD | Frontend | API Backend |
---|
Visão Geral
Este banco de dados suporta toda a criação e relacionamento das entidades necessárias para funcionamento da API do Coopera-RS. Armazena todas as entidades necessárias para o relacionamento de usuários, produtos e compras.
Foram utilizados o PostgreSQL 15 como banco de dados relacional e o Redis como banco de dados não relacional.
1. Modelagem
1.1 Modelo Conceitual
A modelagem conceitual foi feita utilizando a ferramenta Astah Professional:
1.2 Modelo Lógico
A modelagem lógica foi feita utilizando a ferramenta online DrawSQL, por oferecer suporte às funcionalidades específicas do PostgreSQL:
2. Diagrama do Banco de Dados (DER)
drawSQL-image-export-2025-06-16.png
3. Tabelas
Abaixo segue uma descrição detalhada de cada tabela no banco de dados.
user
(client
)
3.1. Tabela A tabela user
foi criada como client
para evitar a palavra reservada 'user' do SQL. No entanto, toda a modelagem seguiu a nomenclatura 'user' para manter maior lógica semântica.
O user
é o usuário base da aplicação, contendo informações necessárias para poder atuar como comprador. Toda loja também será um user, por isso há a definição do role
, diferenciando lojas e apenas usuários compradores. Ao ser criado, o usuário é do tipo CLIENT, ativo e não verificado.
Colunas:
Nome da Coluna | Tipo de Dado | Restrições (Constraints) | Descrição | Valor Exemplo |
---|---|---|---|---|
id_user |
bigserial |
PRIMARY KEY , AUTO_INCREMENT
|
Identificador único para o usuário. Auto-incrementado e sequencial. | 57 |
email |
varchar |
UNIQUE , NOT NULL
|
Endereço de e-mail do usuário. | [email protected] |
role |
enum |
DEFAULT 'CLIENT' |
Papel do usuário. |
CLIENT ou STORE
|
name |
varchar |
NOT NULL |
Nome completo do usuário. | João Silva |
phone |
varchar |
NOT NULL |
Número de telefone do usuário. | +5551912345678 |
id_address |
long |
Marcador do endereço ativo do usuário | 2 |
|
is_verified |
boolean |
DEFAULT false |
Sinalizador indicando se o e-mail do usuário foi verificado. | true |
password |
varchar |
NOT NULL |
Senha criptografada do usuário. | (valor_hash) |
last_updated |
timestamp |
DEFAULT CURRENT_TIMESTAMP |
Timestamp da última atualização do registro do usuário. | 2025-06-03 10:00:00 |
is_active |
boolean |
DEFAULT true |
Sinalizador indicando se a conta do usuário está ativa. | true |
address
3.2. Tabela Armazena informações referentes ao endereços cadastrados. Está equipada para receber endereços completos, inclusive com bairro, cidade, estado e país.
Colunas:
Nome da Coluna | Tipo de Dado | Restrições (Constraints) | Descrição | Valor Exemplo |
---|---|---|---|---|
id_address |
bigserial |
PRIMARY KEY , AUTO_INCREMENT
|
Identificador único para o endereço. | 201 |
id_user |
bigint |
FOREIGN KEY referencia user(id_user)
|
Identificador do usuário ao qual este endereço pertence. | 101 |
cep |
varchar (8) |
NOT NULL |
Código de Endereçamento Postal (CEP). | 90000000 |
street |
varchar |
NOT NULL |
Nome da rua. | Avenida Brasil |
number |
INT |
NOT NULL |
Número do imóvel/edifício. | 123 |
unit |
varchar |
Complemento. | 301 |
|
neighborhood |
varchar |
NOT NULL |
Nome do bairro. | Centro |
city |
varchar |
NOT NULL |
Nome da cidade. | Alegrete |
state |
varchar |
NOT NULL |
Estado ou província (UF). | RS |
country |
varchar |
NOT NULL |
Nome do país. | Brasil |
last_updated |
timestamp |
DEFAULT CURRENT_TIMESTAMP |
Timestamp da última atualização. | 2025-06-03 10:05:00 |
is_active |
boolean |
DEFAULT true |
Sinalizador indicando se o endereço está ativo. | true |
Relacionamentos:
-
fk_user
: Relacionamento N:1 com a tabelauser
(address.fk_user
->user.id_user
): cada endereço pertence a um usuário.
store
3.3. Tabela Armazena informações da loja. Como a loja também será um possível usuário comprador, essa tabela é tratada como "extensão" da tabela user
.
Colunas:
Nome da Coluna | Tipo de Dado | Restrições (Constraints) | Descrição | Valor Exemplo |
---|---|---|---|---|
id_store |
bigint |
PRIMARY KEY , FOREIGN KEY referencia user(id_user)
|
Identificador único para a loja. É o mesmo ID do usuário dono da loja. | 101 |
store_name |
varchar |
NOT NULL |
Nome da loja. | Loja Sensacional |
cnpj |
varchar(14) |
UNIQUE , NOT NULL
|
Cadastro Nacional da Pessoa Jurídica (CNPJ) da loja. | 00000000000100 |
description |
text |
Descrição detalhada da loja. | Vende produtos de alta qualidade |
|
main_address_id |
bigint |
FOREIGN KEY referencia address(id_address)
|
Identificador do endereço principal da loja, com a localização física dela. | 205 |
profile_img_url |
text |
URL da imagem de perfil da loja armazenada no S3. | https://cdn.example.com/loja.jpg |
Relacionamentos:
- Relacionamento 1:1 com tabela de usuário, replicando o ID, e agindo como uma extensão da tabela.
- Relacionamento 1:1 com tabela de endereços, registrando, opcionalmente, o endereço da loja física, para exibição no mapa.
store_photo
3.4. Tabela Armazena as informações referentes à galeria de uma loja, inclusive as posições para manter o posicionamento desejado. Não contém a foto de perfil.
Colunas:
Nome da Coluna | Tipo de Dado | Restrições (Constraints) | Descrição | Valor Exemplo |
---|---|---|---|---|
id_store_photo |
bigserial |
PRIMARY KEY , AUTO_INCREMENT
|
Identificador único para cada foto da loja. | 401 |
fk_store |
bigint |
FOREIGN KEY referencia store(id_store)
|
Identificador da loja à qual esta foto pertence. | 301 |
photo_url |
text |
NOT NULL |
URL da foto armazenada no S3. | https://cdn.example.com/foto1.jpg |
position |
int |
Ordem/posição da foto no template da galeria. |
NULL , 1 , 2 , 3 ou 4
|
Relacionamentos:
-
fk_store
: Relacionamento N:1 com a tabelastore
(store_photo.fk_store
->store.id_store
).
metrics
3.5. Tabela Armazena as métricas diárias de uma loja, com um registro para cada par loja-dia.
Colunas:
Nome da Coluna | Tipo de Dado | Restrições (Constraints) | Descrição | Valor Exemplo |
---|---|---|---|---|
id_metrics |
bigserial |
PRIMARY KEY , AUTO_INCREMENT
|
Identificador único para o registro de métricas. | 501 |
id_store |
bigint |
FOREIGN KEY referencia store(id_store)
|
Identificador da loja à qual estas métricas pertencem. | 301 |
date |
date |
NOT NULL |
Data do registro de métricas. | 01/02/2023 |
removals |
int |
DEFAULT 0 |
Contagem de remoções de produtos da loja do carrinho no dia. | 5 |
visits |
int |
DEFAULT 0 |
Contagem de visitas à página da loja no dia. | 5 |
views |
int |
DEFAULT 0 |
Contagem de visualizações de produtos da loja no dia. | 1250 |
carts |
int |
DEFAULT 0 |
Contagem de carrinhos da loja no dia. | 150 |
reviews |
int |
DEFAULT 0 |
Contagem de revisões de pedido da loja no dia. | 45 |
completed |
int |
DEFAULT 0 |
Contagem de pedidos concluídos da loja no dia. | 130 |
last_updated |
timestamp |
DEFAULT CURRENT_TIMESTAMP |
Timestamp da última atualização das métricas. | 2025-06-03 11:00:00 |
Relacionamentos:
-
id_store
: Relacionamento N:1 com a tabelastore
(metrics.id_store
->store.id_store
). -
UNIQUE(id_store, date)
: O par loja-dia na tabela de métricas deve ser único.
category
3.6. Tabela Armazena as categorias de produto (Eletrônico, Roupas, Etc.). Será carregada com valores pré-determinados, não recebendo inserções do usuário.
Colunas:
Nome da Coluna | Tipo de Dado | Restrições (Constraints) | Descrição | Valor Exemplo |
---|---|---|---|---|
id_category |
bigserial |
PRIMARY KEY , AUTO_INCREMENT
|
Identificador único para a categoria. | 601 |
name |
varchar |
UNIQUE , NOT NULL
|
Nome da categoria. | Eletrônicos |
Relacionamentos:
- É um 'guarda-chuva' de produtos.
product
3.7. Tabela Armazena as informações gerais do produto, sem ter as informações pertinentes apenas à cada variação.
Colunas:
Nome da Coluna | Tipo de Dado | Restrições (Constraints) | Descrição | Valor Exemplo |
---|---|---|---|---|
id_product |
bigserial |
PRIMARY KEY , AUTO_INCREMENT
|
Identificador único para o produto. | 701 |
id_store |
bigint |
FOREIGN KEY referencia store(id_store)
|
Identificador da loja que vende este produto. | 301 |
name |
varchar |
NOT NULL |
Nome do produto. | Super Smartphone |
description |
text |
Descrição genérica do produto. | Smartphone com sistema operacional X |
|
last_updated |
timestamp |
DEFAULT CURRENT_TIMESTAMP |
Timestamp da última atualização. | 2025-05-20 10:00:00 |
Relacionamentos:
-
id_store
: Relacionamento N:1 com a tabelastore
(product.id_store
->store.id_store
).
product_photo
3.8. Tabela Armazena N fotos para um produto.
Colunas:
Nome da Coluna | Tipo de Dado | Restrições (Constraints) | Descrição | Valor Exemplo |
---|---|---|---|---|
id_product_photo |
bigserial |
PRIMARY KEY , AUTO_INCREMENT
|
Identificador único para a foto do produto. | 801 |
fk_product |
bigint |
FOREIGN KEY referencia product(id_product)
|
Identificador do produto ao qual esta foto pertence. | 701 |
photo_url |
varchar |
NOT NULL |
URL da foto do produto armazenada no S3. | https://cdn.example.com/produto_A.jpg |
Relacionamentos:
-
id_product
: Relacionamento N:1 com a tabelaproduct
(product_photo.id_product
->product.id_product
).
product_category
(Tabela Intermediária)
3.9. Tabela Armazena os relacionamentos categoria-produto, já que estes tem uma relação N:N. Na modelagem do banco, ele foi preparado para um produto ter várias categorias e uma categoria ter vários produtos.
Colunas:
Nome da Coluna | Tipo de Dado | Restrições (Constraints) | Descrição | Valor Exemplo |
---|---|---|---|---|
fk_product |
bigint |
FOREIGN KEY referencia product(id_product) , PRIMARY KEY (parte de composta) |
Identificador do produto. | 701 |
fk_category |
bigint |
FOREIGN KEY referencia category(id_category) , PRIMARY KEY (parte de composta) |
Identificador da categoria. | 601 |
Relacionamentos:
-
fk_product
: Relacionamento N:1 com a tabelaproduct
(product_category.fk_product
->product.id_product
). -
fk_category
: Relacionamento N:1 com a tabelacategory
(product_category.fk_category
->category.id_category
).
variant_category
3.10. Tabela Armazena as características de um produto, como Cor, Tamanho, Tecido, etc. Aqui é guardado um valor digitado pelo usuário e cada uma é relacionada apenas ao produto específico.
Colunas:
Nome da Coluna | Tipo de Dado | Restrições (Constraints) | Descrição | Valor Exemplo |
---|---|---|---|---|
id_variant_category |
bigserial |
PRIMARY KEY , AUTO_INCREMENT
|
Identificador único para a categoria da variante. | 1001 |
name |
varchar |
NOT NULL |
Nome da categoria da variante (e.g., "Cor", "Tamanho"). | Cor |
id_product |
bigint |
FOREIGN KEY referencia product(id_product)
|
ID do produto com essas características. | 10 |
Relacionamentos:
- Referencia o ID do produto
variant_category_product
.
variant_option
3.11. Tabela Armazena as opções para cada característica (variant_category
) de um produto, como Cores (vermelho, azul), tamanho (P, M, G, 41, 42) etc.
Colunas:
Nome da Coluna | Tipo de Dado | Restrições (Constraints) | Descrição | Valor Exemplo |
---|---|---|---|---|
id_variant_option |
bigserial |
PRIMARY KEY , AUTO_INCREMENT
|
Identificador único para a opção da categoria da variante (característica). | 1001 |
option |
varchar |
NOT NULL |
Opção | Vermelho |
id_variant_category |
bigint |
FOREIGN KEY referencia variant_category(id_variant_category)
|
ID da característica. | 10 |
Relacionamentos:
- Referencia o ID da característica
id_variant_category
.
product_variant
3.12. Tabela Armazena cada uma das variantes do produto. Cada produto deve ter ao menos uma variante, para ter indicação de preço e estoque. Tem um campo details
que armazena uma string concatenada de uma opção para cada característica. A concatenação dos valores da variantes é verificada no backend e estruturada de forma que, para cada característica do produto, haja um valor de opção na string concatenada, ordenada por valor crescente de id_variant_category
.
Colunas:
Nome da Coluna | Tipo de Dado | Restrições (Constraints) | Descrição | Valor Exemplo |
---|---|---|---|---|
id_product_variant |
bigserial |
PRIMARY KEY , AUTO_INCREMENT
|
Identificador único para a variante do produto. | 1101 |
fk_product |
bigint |
FOREIGN KEY referencia product(id_product)
|
Identificador do produto base. | 701 |
stock |
int |
NOT NULL |
Estoque disponível para esta variante. | 50 |
price |
decimal |
NOT NULL |
Preço desta variante específica. | 29.99 |
details |
varchar |
NOT NULL |
Detalhes específicos da variante concatenados de forma lógica. | vermelho_gg_algodao |
last_updated |
timestamp |
DEFAULT CURRENT_TIMESTAMP |
Timestamp da última atualização. | 2025-06-01 12:00:00 |
is_active |
boolean |
DEFAULT true |
Sinalizador indicando se esta variante está ativa. | true |
Relacionamentos:
-
fk_product
: Relacionamento Muitos-para-Um com a tabelaproduct
(product_variant.fk_product
->product.id_product
).
sponsor
3.13. Tabela Armazena as informações dos patrocinadores do Coopera-RS.
Colunas:
Nome da Coluna | Tipo de Dado | Restrições (Constraints) | Descrição | Valor Exemplo |
---|---|---|---|---|
id |
bigserial |
PRIMARY KEY , AUTO_INCREMENT
|
Identificador único para o patrocinador. | 1001 |
name |
varchar |
NOT NULL |
Nome do patrocinador | PUCRS |
url |
text |
URL do site do patrocinador. | pucrs.br |
|
image_url |
text |
URL da imagem do patrocinador |
Relacionamentos:
- Nenhum
order
3.14. Tabela Armazena as ordens do marketplace.
Colunas:
Nome da Coluna | Tipo de Dado | Restrições (Constraints) | Descrição | Valor Exemplo |
---|---|---|---|---|
id_order |
bigserial |
PRIMARY KEY , AUTO_INCREMENT
|
Identificador único para o pedido. | 1301 |
fk_user |
bigint |
FOREIGN KEY referencia user(id_user)
|
Identificador do usuário que fez o pedido. | 101 |
fk_store |
bigint |
FOREIGN KEY referencia store(id_store)
|
Identificador da loja de onde o pedido é. | 301 |
date |
date |
NOT NULL |
Data em que o pedido foi feito. | 2025-06-03 |
payment_method |
enum |
NOT NULL |
Método de pagamento utilizado. | 'PIX','CREDIT','DEBIT','CASH' |
status |
enum |
NOT NULL |
Status atual do pedido. | PENDING,PREPARING,SENT,DELIVERED,CANCELLED |
fk_address |
bigint |
FOREIGN KEY referencia address(id_address)
|
Endereço de entrega do pedido. | 201 |
last_updated |
timestamp |
DEFAULT CURRENT_TIMESTAMP |
Timestamp da última atualização do pedido. | 2025-06-03 14:30:00 |
Relacionamentos:
-
fk_user
: Relacionamento N:1 com a tabelauser
. -
fk_store
: Relacionamento N:1 com a tabelastore
. -
fk_address
: Relacionamento N:1 com a tabelaaddress
.
order_item
3.15. Tabela Armazena cada item de uma ordem, com referência para o item, a ordem e a quantidade.
Colunas:
Nome da Coluna | Tipo de Dado | Restrições (Constraints) | Descrição | Valor Exemplo |
---|---|---|---|---|
id_order_item |
bigserial |
PRIMARY KEY , AUTO_INCREMENT
|
Identificador único para o item do pedido. | 1401 |
fk_order |
bigint |
FOREIGN KEY referencia order(id_order)
|
Identificador do pedido ao qual este item pertence. | 1301 |
fk_product_variant |
bigint |
FOREIGN KEY referencia product_variant(id_product_variant)
|
Identificador da variante do produto pedida. | 1101 |
quantity |
int |
NOT NULL |
Quantidade da variante do produto pedida. | 2 |
Relacionamentos:
-
fk_order
: Relacionamento N:1 com a tabelaorder
. -
fk_product_variant
: Relacionamento N:1 com a tabelaproduct_variant
.
evaluation
3.16. Tabela Armazena todas as informações pertinentes ao sistema de avaliações.
Colunas:
Nome da Coluna | Tipo de Dado | Restrições (Constraints) | Descrição | Valor Exemplo |
---|---|---|---|---|
id_evaluation |
bigserial |
PRIMARY KEY , AUTO_INCREMENT
|
Identificador único para a avaliação. | 1501 |
fk_order |
bigint |
FOREIGN KEY referencia order(id_order)
|
Identificador do pedido sendo avaliado. | 1301 |
rating |
int |
NOT NULL |
Avaliação dada pelo usuário (e.g., 1-5 estrelas). | 5 |
comment |
varchar |
NOT NULL |
Comentário em texto ou avaliação. | Ótimo produto! |
answer |
varchar |
Resposta da loja à avaliação. | Obrigado! |
|
date |
date |
NOT NULL |
Data em que a avaliação foi enviada. | 2025-06-10 |
last_updated |
timestamp |
DEFAULT CURRENT_TIMESTAMP |
Timestamp da última atualização. | 2025-06-10 09:00:00 |
Relacionamentos:
-
fk_order
: Relacionamento 1:1 com a tabelaorder
.
Modelo não-relacional utilizando Redis
Para a implementação do carrinho, devido à sua alta volatilidade e frequentes operações de sobrescrever e deletar informações, optou-se por integrar um modelo não relacional. Cada carrinho irá conter informações do usuário dono do carrinho e da loja, bem como uma lista de itens, como mostra o exemplo abaixo:
{
"id_user": 17,
"id_store": 3,
"items": [
{
"id": 9,
"storeID": 3,
"name": "Produto 1",
"description": "Produto teste",
"photos": [
"https://example.com/photo.jpg"
],
"category": [
{
"id": 1,
"name": "Roupas"
}
],
"variant": {
"price": 10,
"stock": 1,
"options": {
"Cor": "Vermelho",
"Tamanho": "M"
}
},
"quantity": 5,
"lastUpdated": "2025-06-16T17:28:04.576495"
}
]
}