Skip to content

GitLab

  • Menu
Projects Groups Snippets
    • Loading...
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in
  • W Wiki
  • Project information
    • Project information
    • Activity
    • Labels
    • Planning hierarchy
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 0
    • Issues 0
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 0
    • Merge requests 0
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Monitor
    • Monitor
    • Incidents
  • Packages & Registries
    • Packages & Registries
    • Package Registry
    • Infrastructure Registry
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • WeConecta - Plataforma digital para questionários de saúde
  • Wiki
  • Wiki
  • banco_dados

banco_dados · Changes

Page history
Update banco_dados authored Oct 09, 2025 by William De Oliveira Klein's avatar William De Oliveira Klein
Hide whitespace changes
Inline Side-by-side
banco_dados.md
View page @ cd217e03
# Banco de Dados Postgres
# Banco de Dados PostgreSQL
O projeto WeConecta utiliza o PostgreSQL como sistema gerenciador de banco de dados.
O projeto **WeConecta** utiliza o **PostgreSQL** como sistema gerenciador de banco de dados.
O PostgreSQL é um banco de dados relacional robusto, confiável e amplamente utilizado em aplicações que exigem consistência, integridade e suporte a operações complexas. Ele oferece recursos avançados como controle de concorrência multiversão (MVCC), suporte a transações ACID, extensibilidade com funções e tipos personalizados, além de boa performance em ambientes de produção com grande volume 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**:
![weconecta_ER](uploads/da78624049bbf5a10d4f18bb33e9c77f/weconecta_ER.png)
## Modelo Lógico
A seguinte modelagem foi desenvolvida utilizando a ferramenta online dbdiagram.io:
A modelagem lógica foi criada na ferramenta online **dbdiagram.io**:
![Copy_of_Untitled_Diagram.svg](uploads/020298ae65d1157fbfc24e2df576ed01/Copy_of_Untitled_Diagram.svg)
## 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` |
| email | `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` via `first_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
![Untitled](uploads/82bab072fc991467ea2fec09d3e38afe/Untitled.png)
## Tabelas
Armazena as respostas dos usuários aos questionários.
Cada linha representa **uma resposta individual** de um participante.
A seguir, têm-se explicações detalhadas sobre as tabelas desenvolvidas para o banco de dados.
## users
Tabela que armazena os usuários do sistema (autenticação, perfil e status). Cada registro representa um usuário único da API.
| Nome da Coluna | Tipo de Dado | Restrições (Constraints) | Descrição | Valor Exemplo |
|---|---|---|---|---|
| id | integer (auto-increment) | **PRIMARY KEY** | Identificador único do usuário. | 57 |
| email | varchar(255) | **UNIQUE**, **NOT NULL** | E-mail de login do usuário. | [email protected] |
| password | varchar(255) | **NOT NULL** | Hash da senha do usuário. | `$2a$10$...` |
| phone | varchar(11) | **UNIQUE**, **NULLABLE** | Telefone (somente dígitos). Pode ficar vazio. | `51999990000` |
| friendly_name | varchar(255) | **NOT NULL** | Nome de exibição do usuário. | João Silva |
| role | enum(`UserRole`) | **DEFAULT** `'MEMBER'` | Papel do usuário no sistema. Pode ser `ADMIN` (administrador, com acesso total e permissões de gerenciamento) ou `MEMBER` (usuário comum, com permissões limitadas). O valor padrão é `MEMBER`. | MEMBER |
| blocked_at | timestamp | **NULLABLE** | Data/hora em que o usuário foi bloqueado (se houver). | 2025-09-01 13:45:12 |
| first_login | boolean | **DEFAULT** `true` | Indica se é o primeiro acesso após cadastro. | false |
| created_at | timestamp | **DEFAULT** `CURRENT_TIMESTAMP` | Momento de criação do registro. | 2025-09-01 12:30:00 |
### Observações e Relacionamentos
- **Relacionamentos**: 1:N com `users_surveys` (`User` → `UsersSurveys`), permitindo consultar os questionários vinculados a cada usuário.
## surveys
Tabela que representa os questionários do sistema (metadados, status de publicação e fluxo de navegação entre elementos).
| Nome da Coluna | Tipo de Dado | Restrições (Constraints) | Descrição | Valor Exemplo |
|---|---|---|---|---|
| id | integer (auto-increment) | **PRIMARY KEY** | Identificador único do questionário. | 12 |
| first_survey_element | integer | **FK** → `survey_elements(id)`, **NULLABLE**, **ON DELETE SET NULL** | Primeiro elemento do fluxo do questionário. | 101 |
| title | varchar(255) | **NOT NULL** | Título do questionário. | Pesquisa de Satisfação |
| description | varchar(500) | **NULLABLE** | Descrição breve do questionário. | Avalie seu atendimento |
| url | varchar(255) | **NULLABLE** | URL pública/slug de acesso ao questionário. | `/q/satisfacao-2025` |
| is_published | boolean | **DEFAULT** `false` | Indica se o questionário está publicado. | true |
| created_at | timestamp | **DEFAULT** `CURRENT_TIMESTAMP` | Momento de criação do registro. | 2025-09-01 12:30:00 |
| flow | json | **NULLABLE**, **DEFAULT** `null` | Definição do fluxo entre elementos (nós e setas/opções). | ver abaixo |
### Observações e Relacionamentos
- **flow (JSON)**: lista de nós do fluxo. Cada item mapeia um elemento do questionário e suas opções de saída (com setas para o próximo elemento). Estrutura esperada:
```json
[
{
"surveyElementId": 101,
"coordinates": { "x": 120, "y": 80 },
"options": [
{
"coordinates": { "x": 200, "y": 80 },
"optionId": 5,
"nextSurveyElementId": 102
}
]
}
]
- `nextSurveyElementId` pode ser `null` (fim de fluxo).
### Relacionamentos
- **N:1** com `survey_elements` via `first_survey_element`.
- **1:N** com `users_surveys` (`Survey` → `UsersSurveys`) para vincular usuários aos questionários.
## users_surveys
Tabela de junção que relaciona usuários (`users`) com questionários (`surveys`). Cada registro indica que um usuário está vinculado a um determinado questionário.
| Nome da Coluna | Tipo de Dado | Restrições (Constraints) | Descrição | Valor Exemplo |
|---|---|---|---|---|
| id | integer (auto-increment) | **PRIMARY KEY** | Identificador único da relação. | 45 |
| user_id | integer | **FK** → `users(id)`, **NOT NULL**, **ON DELETE CASCADE** | Referência ao usuário vinculado. | 57 |
| survey_id | integer | **FK** → `surveys(id)`, **NOT NULL**, **ON DELETE CASCADE** | Referência ao questionário vinculado. | 12 |
### Relacionamentos
- **N:1** com `users` (um vínculo pertence a um único usuário).
- **N:1** com `surveys` (um vínculo pertence a um único questionário).
- Forma a relação **N:N** entre `users` e `surveys`, pois um usuário pode estar em vários questionários, e um questionário pode estar vinculado a vários usuários.
## survey_elements
Tabela que representa os elementos de um questionário. Cada elemento pode ser um campo de entrada, uma mensagem ou um conjunto de opções.
| Nome da Coluna | Tipo de Dado | Restrições (Constraints) | Descrição | Valor Exemplo |
|---|---|---|---|---|
| id | integer (auto-increment) | **PRIMARY KEY** | Identificador único do elemento. | 101 |
| description | varchar(500) | **NOT NULL** | Texto descritivo ou enunciado exibido no elemento do questionário. | Qual sua idade? |
| type | enum(`SurveyElementType`) | **NOT NULL** | Tipo do elemento no questionário. Pode ser:<br> - `OPTION`: elemento de opção única<br> - `MULTIPLE_CHOICE`: múltipla escolha<br> - `INPUT`: campo de entrada de texto<br> - `MESSAGE`: mensagem informativa | OPTION |
| tag | varchar(255) | **NOT NULL** | Identificador único (slug/tag) usado para referência lógica no fluxo. | idade_usuario |
### Relacionamentos
- **1:N** com `options` (`SurveyElement` → `Option`), permitindo definir as opções vinculadas ao elemento.
- Pode ser referenciado em `surveys.flow` como parte do fluxo de execução do questionário.
## options
Tabela que representa as opções vinculadas a elementos do tipo escolha em um questionário. Cada opção pertence a um `survey_element`.
| Nome da Coluna | Tipo de Dado | Restrições (Constraints) | Descrição | Valor Exemplo |
|---|---|---|---|---|
| id | integer (auto-increment) | **PRIMARY KEY** | Identificador único da opção. | 301 |
| survey_element_id | integer | **FK** → `survey_elements(id)`, **NOT NULL**, **ON DELETE CASCADE** | Referência ao elemento do questionário ao qual a opção pertence. | 101 |
| description | varchar(255) | **NOT NULL** | Texto exibido como alternativa ao usuário. | 18 a 24 anos |
### Relacionamentos
- **N:1** com `survey_elements` (`Option` → `SurveyElement`), pois cada opção pertence a um elemento.
- Usado em conjunto com o fluxo (`surveys.flow`) para definir a navegação entre elementos.
| 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` — uma `survey_answer` pode ter **0 ou 1 option**, e uma `option` pode estar em **0 ou N answers**.
Clone repository
  • Home
  • arquitetura
  • banco_dados