mirror of
https://github.com/lucasrcsantana/story-generator.git
synced 2025-12-17 05:47:52 +00:00
316 lines
7.6 KiB
Markdown
316 lines
7.6 KiB
Markdown
# Estrutura do Banco de Dados
|
|
|
|
## Visão Geral
|
|
O banco de dados foi projetado para suportar um sistema educacional de leitura, geração de histórias e exercícios fonéticos, com foco em rastreamento de progresso e gamificação.
|
|
|
|
## Entidades
|
|
|
|
### 1. Escolas e Classes
|
|
```sql
|
|
create table schools (
|
|
id uuid primary key default uuid_generate_v4(),
|
|
name text not null,
|
|
address text,
|
|
phone text,
|
|
email text,
|
|
director_name text,
|
|
created_at timestamptz default now(),
|
|
updated_at timestamptz default now()
|
|
);
|
|
|
|
create table classes (
|
|
id uuid primary key default uuid_generate_v4(),
|
|
school_id uuid references schools(id),
|
|
teacher_id uuid references users(id),
|
|
name text not null,
|
|
grade text,
|
|
year integer,
|
|
period text,
|
|
created_at timestamptz default now(),
|
|
updated_at timestamptz default now()
|
|
);
|
|
|
|
create table students (
|
|
id uuid primary key default uuid_generate_v4(),
|
|
user_id uuid references users(id),
|
|
class_id uuid references classes(id),
|
|
reading_level text,
|
|
birth_date date,
|
|
active boolean default true,
|
|
created_at timestamptz default now(),
|
|
updated_at timestamptz default now()
|
|
);
|
|
```
|
|
|
|
### 2. Histórias
|
|
```sql
|
|
create table stories (
|
|
id uuid primary key default uuid_generate_v4(),
|
|
student_id uuid references users(id),
|
|
title text not null,
|
|
content jsonb not null,
|
|
status text,
|
|
theme_id uuid,
|
|
subject_id uuid,
|
|
character_id uuid,
|
|
setting_id uuid,
|
|
created_at timestamptz default now(),
|
|
updated_at timestamptz default now()
|
|
);
|
|
```
|
|
|
|
### 3. Interesses
|
|
```sql
|
|
create table interests (
|
|
id uuid primary key default uuid_generate_v4(),
|
|
student_id uuid references users(id),
|
|
category text not null,
|
|
item text not null,
|
|
created_at timestamptz default now(),
|
|
updated_at timestamptz default now()
|
|
);
|
|
```
|
|
|
|
### 4. Sistema de Conquistas
|
|
```sql
|
|
create table achievement_types (
|
|
id uuid primary key default uuid_generate_v4(),
|
|
name varchar not null,
|
|
description text,
|
|
created_at timestamptz default now()
|
|
);
|
|
|
|
create table achievements (
|
|
id uuid primary key default uuid_generate_v4(),
|
|
name text not null,
|
|
description text
|
|
);
|
|
```
|
|
|
|
### 5. Sistema Fonético
|
|
|
|
#### Categorias e Palavras
|
|
```sql
|
|
create table phonics_categories (
|
|
id uuid primary key default uuid_generate_v4(),
|
|
name varchar not null,
|
|
description text,
|
|
level integer,
|
|
order_index integer,
|
|
created_at timestamptz default now(),
|
|
updated_at timestamptz default now()
|
|
);
|
|
|
|
create table phonics_words (
|
|
id uuid primary key default uuid_generate_v4(),
|
|
word varchar not null,
|
|
phonetic_transcription varchar,
|
|
syllables_count integer,
|
|
created_at timestamptz default now()
|
|
);
|
|
|
|
create table phonics_word_audio (
|
|
id uuid primary key default uuid_generate_v4(),
|
|
word text not null,
|
|
audio_url text,
|
|
audio_path text,
|
|
created_at timestamptz default now()
|
|
);
|
|
```
|
|
|
|
#### Exercícios
|
|
```sql
|
|
create table phonics_exercise_types (
|
|
id uuid primary key default uuid_generate_v4(),
|
|
name varchar not null,
|
|
description text,
|
|
created_at timestamptz default now()
|
|
);
|
|
|
|
create table phonics_exercises (
|
|
id uuid primary key default uuid_generate_v4(),
|
|
category_id uuid references phonics_categories(id),
|
|
type_id uuid references phonics_exercise_types(id),
|
|
title varchar not null,
|
|
description text,
|
|
difficulty_level integer,
|
|
estimated_time_seconds integer,
|
|
instructions text,
|
|
points integer,
|
|
is_active boolean default true,
|
|
required_score double precision,
|
|
created_at timestamptz default now(),
|
|
updated_at timestamptz default now()
|
|
);
|
|
|
|
create table phonics_exercise_words (
|
|
id uuid primary key default uuid_generate_v4(),
|
|
exercise_id uuid references phonics_exercises(id),
|
|
word_id uuid references phonics_words(id),
|
|
is_correct_answer boolean,
|
|
order_index integer,
|
|
created_at timestamptz default now()
|
|
);
|
|
```
|
|
|
|
#### Mídia
|
|
```sql
|
|
create table media_types (
|
|
id uuid primary key default uuid_generate_v4(),
|
|
name varchar not null,
|
|
description text,
|
|
created_at timestamptz default now()
|
|
);
|
|
|
|
create table phonics_exercise_media (
|
|
id uuid primary key default uuid_generate_v4(),
|
|
exercise_id uuid references phonics_exercises(id),
|
|
media_type_id uuid references media_types(id),
|
|
url text,
|
|
alt_text text,
|
|
order_index integer,
|
|
created_at timestamptz default now()
|
|
);
|
|
```
|
|
|
|
#### Conquistas Fonéticas
|
|
```sql
|
|
create table phonics_achievements (
|
|
id uuid primary key default uuid_generate_v4(),
|
|
type_id uuid references achievement_types(id),
|
|
name varchar not null,
|
|
description text,
|
|
points integer,
|
|
icon_url text,
|
|
required_count integer,
|
|
created_at timestamptz default now()
|
|
);
|
|
```
|
|
|
|
## Relacionamentos
|
|
|
|
### Hierarquia Principal
|
|
```mermaid
|
|
erDiagram
|
|
Schools ||--o{ Classes : "has"
|
|
Classes ||--o{ Students : "contains"
|
|
Students ||--o{ Stories : "creates"
|
|
Students ||--o{ Interests : "has"
|
|
Students ||--o{ Achievements : "earns"
|
|
|
|
PhonicsCategories ||--o{ PhonicsExercises : "contains"
|
|
PhonicsExercises ||--o{ PhonicsExerciseWords : "has"
|
|
PhonicsWords }|--o{ PhonicsExerciseWords : "used_in"
|
|
PhonicsExercises ||--o{ PhonicsExerciseMedia : "has"
|
|
MediaTypes ||--o{ PhonicsExerciseMedia : "defines"
|
|
```
|
|
|
|
## Índices e Otimizações
|
|
|
|
### Performance
|
|
```sql
|
|
-- Busca de exercícios por categoria
|
|
create index idx_exercises_category on phonics_exercises(category_id);
|
|
|
|
-- Busca de histórias por aluno
|
|
create index idx_stories_student on stories(student_id);
|
|
|
|
-- Busca de palavras por exercício
|
|
create index idx_exercise_words on phonics_exercise_words(exercise_id);
|
|
|
|
-- Busca por conteúdo de história
|
|
create index idx_stories_content on stories using gin (content);
|
|
```
|
|
|
|
## Considerações de Segurança
|
|
|
|
### RLS (Row Level Security)
|
|
```sql
|
|
-- Alunos só podem ver suas próprias histórias
|
|
create policy "Students view own stories" on stories
|
|
for select using (auth.uid() = student_id);
|
|
|
|
-- Professores podem ver histórias de seus alunos
|
|
create policy "Teachers view class stories" on stories
|
|
for select using (
|
|
auth.uid() in (
|
|
select teacher_id from classes c
|
|
join students s on s.class_id = c.id
|
|
where s.id = stories.student_id
|
|
)
|
|
);
|
|
```
|
|
|
|
## Triggers
|
|
|
|
### Atualização Automática
|
|
```sql
|
|
-- Atualizar student_progress após nova gravação
|
|
create trigger update_student_progress
|
|
after insert or update on story_recordings
|
|
for each row
|
|
execute function update_student_progress();
|
|
|
|
-- Calcular duração da sessão de leitura
|
|
create trigger calculate_session_duration
|
|
before update on reading_sessions
|
|
for each row
|
|
when (NEW.end_time is not null)
|
|
execute function calculate_session_duration();
|
|
```
|
|
|
|
## Funções
|
|
|
|
### Análise de Progresso
|
|
```sql
|
|
-- Calcular nível de leitura
|
|
create function calculate_reading_level(
|
|
student_id uuid
|
|
) returns text as $$
|
|
-- Lógica de cálculo baseada em:
|
|
-- - Média de palavras por minuto
|
|
-- - Scores de fluência
|
|
-- - Quantidade de histórias lidas
|
|
$$ language plpgsql;
|
|
|
|
-- Atualizar métricas de progresso
|
|
create function update_student_progress() returns trigger as $$
|
|
-- Atualiza:
|
|
-- - Médias de performance
|
|
-- - Total de tempo lido
|
|
-- - Histórias completadas
|
|
-- - Pontos fortes e melhorias
|
|
$$ language plpgsql;
|
|
```
|
|
|
|
## Considerações de Performance
|
|
|
|
### 1. Particionamento
|
|
- Gravações particionadas por mês
|
|
- Sessões particionadas por aluno
|
|
- Histórias particionadas por complexidade
|
|
|
|
### 2. Vacuum
|
|
- Análise regular de dead tuples
|
|
- Vacuum automático configurado
|
|
- Monitoramento de bloat
|
|
|
|
### 3. Cache
|
|
- Histórias populares em cache
|
|
- Métricas de progresso em cache
|
|
- Configurações de usuário em cache
|
|
|
|
## Backup e Recuperação
|
|
|
|
### 1. Estratégia
|
|
- Backup completo diário
|
|
- WAL archiving contínuo
|
|
- Retenção de 30 dias
|
|
- Teste mensal de recuperação
|
|
|
|
### 2. Monitoramento
|
|
- Tamanho do banco
|
|
- Tempo de queries
|
|
- Uso de índices
|
|
- Deadlocks
|