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:
- 0: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. | Pré-diagnóstico |
| description | varchar(500) |
NULLABLE | Descrição breve. | Avaliação online para identificar sintomas e suspeitas sobre a doença X |
| url | varchar(255) |
NULLABLE | URL pública do questionário. | /q/pre-diagnostico |
| 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:
- 0:N com
users_surveys(Survey→UsersSurveys). - 1:N com
survey_answers(Survey→SurveyAnswers). - N:1 com
survey_elementsviafirst_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:0 com
users. - N:0 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. | 105 |
| 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_answerpode ter 0 ou 1 option, e umaoptionpode estar em 0 ou N answers.
