... | @@ -4,42 +4,113 @@ O projeto WeConecta utiliza o PostgreSQL como sistema gerenciador de banco de da |
... | @@ -4,42 +4,113 @@ O projeto WeConecta utiliza o PostgreSQL como sistema gerenciador de banco de da |
|
|
|
|
|
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 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.
|
|
|
|
|
|
## Relacionamentos
|
|
## Modelo Lógico
|
|
|
|
|
|
- Um usuário pode estar associado a vários questionários
|
|
A seguinte modelagem foi desenvolvida utilizando a ferramenta online dbdiagram.io:
|
|
(`Usuario_Questionario.id_usuario → Usuario.id`,
|
|
|
|
`Usuario_Questionario.id_questionario → Questionario.id`)
|
|
|
|
|
|
|
|
- Um usuário pode ter vários registros de participação em questionários
|
|

|
|
(`Usuario.usuario_questionarios → Usuario_Questionario.id_usuario`)
|
|
|
|
|
|
|
|
- Um questionário pode ter vários usuários participantes
|
|
## Tabelas
|
|
(`Questionario.usuario_questionarios → Usuario_Questionario.id_questionario`)
|
|
|
|
|
|
|
|
- Um questionário começa em uma primeira mensagem
|
|
A seguir, têm-se explicações detalhadas sobre as tabelas desenvolvidas para o banco de dados.
|
|
(`Questionario.id_primeira_mensagem → Mensagem.id`)
|
|
|
|
|
|
|
|
- Um questionário pode ter vários fluxos de mensagens
|
|
## users
|
|
(`Fluxo_Questionario.id_questionario → Questionario.id`)
|
|
|
|
|
|
|
|
- Uma mensagem pode ser a **atual**, **anterior** ou **próxima** em um fluxo
|
|
Tabela que armazena os usuários do sistema (autenticação, perfil e status). Cada registro representa um usuário único da API.
|
|
(`Fluxo_Questionario.id_mensagem_atual → Mensagem.id`,
|
|
|
|
`Fluxo_Questionario.id_mensagem_anterior → Mensagem.id`,
|
|
|
|
`Fluxo_Questionario.id_proxima_mensagem → Mensagem.id`)
|
|
|
|
|
|
|
|
- Uma mensagem pode ter várias respostas de usuários
|
|
| Nome da Coluna | Tipo de Dado | Restrições (Constraints) | Descrição | Valor Exemplo |
|
|
(`Resposta.id_mensagem → Mensagem.id`)
|
|
|---|---|---|---|---|
|
|
|
|
| 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 |
|
|
|
|
|
|
- Uma mensagem pode ter várias alternativas de resposta
|
|
### Observações e Relacionamentos
|
|
(`Alternativa.id_mensagem → Mensagem.id`)
|
|
- **Relacionamentos**: 1:N com `users_surveys` (`User` → `UsersSurveys`), permitindo consultar os questionários vinculados a cada usuário.
|
|
|
|
|
|
- Uma alternativa pode direcionar o fluxo para a próxima mensagem
|
|
## surveys
|
|
(`Fluxo_Questionario.id_alternativa → Alternativa.id`)
|
|
|
|
|
|
|
|
- Uma resposta pode conter a alternativa escolhida
|
|
Tabela que representa os questionários do sistema (metadados, status de publicação e fluxo de navegação entre elementos).
|
|
(`Resposta.id_alternativa_selecionada → Alternativa.id`)
|
|
|
|
|
|
|
|
- Um questionário pode ter várias respostas
|
|
| Nome da Coluna | Tipo de Dado | Restrições (Constraints) | Descrição | Valor Exemplo |
|
|
(`Resposta.id_questionario → Questionario.id`)
|
|
|---|---|---|---|---|
|
|
|
|
| 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. |