# Modelo de datos — Fase 1

## Entidades y relaciones

```mermaid
erDiagram
  usuarios ||--o| odontologos : tiene_perfil
  odontologos ||--o{ odontologo_paciente : asigna
  pacientes ||--o{ odontologo_paciente : es_asignado
  odontologo_paciente ||--o{ permisos_colaboracion : concede
  odontologos ||--o{ citas : atiende
  pacientes ||--o{ citas : agenda
  odontologos ||--o{ consultas : autor
  pacientes ||--o{ consultas : posee
  consultas ||--o{ revisiones_consulta : corrige
  consultas ||--o{ fotografias : relaciona
  pacientes ||--o{ fotografias : posee
  odontologos ||--o{ auditoria : realiza
```

## Tablas iniciales

| Tabla | Propósito y claves principales |
| --- | --- |
| `usuarios` | Cuenta autenticable: `id`, correo único, `password_hash`, estado, fechas. |
| `odontologos` | Perfil profesional, FK única a `usuarios.id`. |
| `pacientes` | Datos generales únicos del paciente; no contiene el odontólogo propietario. |
| `odontologo_paciente` | Asignación: `odontologo_id`, `paciente_id`, estado, creado_por. UNIQUE (`odontologo_id`, `paciente_id`). |
| `permisos_colaboracion` | Permiso revocable y auditable sobre asignación/paciente: otorgante, receptor, tipo, estado, vigencia. |
| `citas` | `odontologo_id`, `paciente_id`, inicio, fin, estado y bloqueo; índice por odontólogo/rango/estado. |
| `consultas` | Registro inmutable base: paciente, `odontologo_autor_id`, fecha, motivo, diagnóstico, tratamiento, observaciones. |
| `revisiones_consulta` | Corrección aditiva: consulta, autor, razón, contenido revisado y fecha. |
| `fotografias` | Referencia privada a original/miniatura, paciente, consulta opcional, tratamiento opcional y autor. |
| `recordatorios` | Cita, paciente, odontólogo, canal, plantilla, idempotency key y estado. |
| `auditoria` | Actor, acción, recurso, resultado, IP minimizada, fecha y correlación. |

Las migraciones de la Fase 2 definirán tipos, FKs, borrado lógico donde proceda y restricciones. Para impedir traslapes concurrentes, la creación de una cita se ejecutará en transacción con bloqueo del rango/agenda y una validación final en servidor.

## Índices obligatorios

- `odontologo_paciente(odontologo_id, paciente_id)` único y `(paciente_id, odontologo_id)`.
- `citas(odontologo_id, inicio, estado)` y `citas(paciente_id, inicio)`.
- `consultas(paciente_id, fecha DESC)` y `consultas(odontologo_autor_id, fecha DESC)`.
- `fotografias(paciente_id, creada_en DESC)` y `(consulta_id)`.
- `auditoria(actor_id, creada_en DESC)` y `(recurso_tipo, recurso_id, creada_en DESC)`.
