story-generator/docs/banco-dados.md

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