Banco de Dados PostgreSQL
O projeto WeConecta utiliza o PostgreSQL como sistema gerenciador de banco de dados.
O PostgreSQL é um SGBD relacional robusto, confiável e amplamente utilizado em aplicações que exigem consistência, integridade referencial e transações ACID. Ele oferece recursos avançados como controle de concorrência multiversão (MVCC), extensibilidade com funções e tipos personalizados e excelente performance em ambientes com grande volume de dados.
Modelo Conceitual
A modelagem conceitual foi desenvolvida utilizando a ferramenta brModelo:
Modelo Lógico
A modelagem lógica foi criada na ferramenta online dbdiagram.io:
Estrutura das Tabelas
A seguir estão as tabelas e descrições detalhadas do banco de dados.
users
Armazena os dados dos usuários do sistema (autenticação, perfil e status).
Cada registro representa um usuário único da API.
Coluna | Tipo | Restrições | Descrição | Exemplo |
---|---|---|---|---|
id | uuid |
PRIMARY KEY, DEFAULT gen_random_uuid()
|
Identificador único do usuário. | a6e1b7b2-12ef-4c45-a8f2-78c41d7f3321 |
varchar(255) |
UNIQUE, NOT NULL | E-mail de login do usuário. | [email protected] | |
password | varchar(255) |
NOT NULL | Hash da senha. | $2a$10$... |
phone | varchar(11) |
UNIQUE, NULLABLE | Telefone (somente dígitos). | 51999990000 |
friendly_name | varchar(255) |
NOT NULL | Nome de exibição. | João Silva |
role | enum(UserRole) |
DEFAULT 'MEMBER'
|
Papel do usuário: ADMIN ou MEMBER . |
MEMBER |
blocked_at | timestamp |
NULLABLE | Data/hora de bloqueio do usuário. | 2025-09-01 13:45:12 |
first_login | boolean |
DEFAULT true
|
Indica se é o primeiro acesso. | false |
created_at | timestamp |
DEFAULT CURRENT_TIMESTAMP
|
Data/hora de criação. | 2025-09-01 12:30:00 |
Relacionamentos:
- 1:N com
users_surveys
(User
→UsersSurveys
).
surveys
Representa os questionários cadastrados no sistema, contendo metadados, fluxo de navegação e status de publicação.
Coluna | Tipo | Restrições | Descrição | Exemplo |
---|---|---|---|---|
id | integer |
PRIMARY KEY | Identificador único. | 12 |
first_survey_element | integer |
FK → survey_elements(id), NULLABLE, ON DELETE SET NULL | Primeiro elemento do fluxo. | 101 |
title | varchar(255) |
NOT NULL | Título do questionário. | Pesquisa de Satisfação |
description | varchar(500) |
NULLABLE | Descrição breve. | Avalie seu atendimento |
url | varchar(255) |
NULLABLE | URL pública do questionário. | /q/satisfacao-2025 |
flow | jsonb |
NULLABLE, DEFAULT null | Define o fluxo entre os elementos (nós e setas). | — |
is_published | boolean |
DEFAULT false | Indica se está publicado. | true |
created_at | timestamp |
DEFAULT CURRENT_TIMESTAMP | Data de criação. | 2025-09-01 12:30:00 |
Relacionamentos:
- 1:N com
users_surveys
(Survey
→UsersSurveys
). - 1:N com
survey_answers
(Survey
→SurveyAnswers
). - N:1 com
survey_elements
viafirst_survey_element
.
users_surveys
Tabela intermediária que representa o relacionamento N:N entre usuários e questionários.
Coluna | Tipo | Restrições | Descrição | Exemplo |
---|---|---|---|---|
id | integer |
PRIMARY KEY | Identificador único da relação. | 45 |
user_id | uuid |
FK → users(id), NOT NULL, ON DELETE CASCADE | Usuário vinculado. | a6e1b7b2-12ef-4c45-a8f2-78c41d7f3321 |
survey_id | integer |
FK → surveys(id), NOT NULL, ON DELETE CASCADE | Questionário vinculado. | 12 |
Relacionamentos:
- N:1 com
users
. - N:1 com
surveys
. - Representa
users (0..N) ⇄ (0..N) surveys
.
survey_elements
Armazena os elementos que compõem os questionários (perguntas, mensagens ou campos de entrada).
Coluna | Tipo | Restrições | Descrição | Exemplo |
---|---|---|---|---|
id | integer |
PRIMARY KEY | Identificador único do elemento. | 101 |
description | varchar(500) |
NOT NULL | Texto ou enunciado exibido. | Qual sua idade? |
type | enum(SurveyElementType) |
NOT NULL | Tipo de elemento: OPTION , MULTIPLE_CHOICE , INPUT , MESSAGE . |
MULTIPLE_CHOICE |
tag | varchar(255) |
NOT NULL | Tag de identificação lógica no fluxo. | idade_usuario |
Relacionamentos:
- 1:N com
options
(SurveyElement
→Option
). - 1:N com
survey_answers
(SurveyElement
→SurveyAnswer
). - Referenciado em
surveys.flow
.
options
Representa as opções vinculadas a um survey_element
(quando o tipo é escolha).
Coluna | Tipo | Restrições | Descrição | Exemplo |
---|---|---|---|---|
id | integer |
PRIMARY KEY | Identificador único da opção. | 301 |
survey_element_id | integer |
FK → survey_elements(id), NOT NULL, ON DELETE CASCADE | Elemento ao qual pertence. | 101 |
description | varchar(255) |
NOT NULL | Texto da opção. | 18 a 24 anos |
Relacionamentos:
- N:1 com
survey_elements
. - 1:N com
survey_answers
(Option
→SurveyAnswer
), pois uma opção pode ser escolhida em várias respostas.
survey_answers
Armazena as respostas dos usuários aos questionários.
Cada linha representa uma resposta individual de um participante.
Coluna | Tipo | Restrições | Descrição | Exemplo |
---|---|---|---|---|
identifier | varchar(255) |
NOT NULL | Identificador único do respondente (token). | resp-9df7a3b1 |
survey_id | integer |
FK → surveys(id), NOT NULL, ON DELETE CASCADE | Questionário ao qual a resposta pertence. | 12 |
survey_element_id | integer |
FK → survey_elements(id), NOT NULL, ON DELETE CASCADE | Elemento respondido. | 101 |
option_id | integer |
FK → options(id), NULLABLE, ON DELETE SET NULL | Opção marcada (para perguntas de escolha). | 301 |
input_response | varchar(500) |
NULLABLE | Resposta textual (para perguntas INPUT ). |
“25 anos” |
Relacionamentos:
- N:1 com
surveys
. - N:1 com
survey_elements
. - 0..1:N com
options
— umasurvey_answer
pode ter 0 ou 1 option, e umaoption
pode estar em 0 ou N answers.