Modelo de datos
Schemas
Sección titulada «Schemas»EMA Well usa dos schemas en su Supabase:
public— datos operativos del producto (pilares, check-ins, racha, suscripciones).fhir— observaciones clínicas del usuario en formato FHIR R4 nativo.
Tablas en public
Sección titulada «Tablas en public»| Tabla | Propósito |
|---|---|
pillars | Pilares activos del usuario. Campos clave: track_type (boolean / duration / count / scale), goal_value, loinc_code. |
daily_logs | Check-in diario. Campos clave: energia (1-5), mood (1-5), impulso (toggle), wins, notas. |
daily_log_entries | Una entry por pilar dentro de un check-in. Campos clave: done (bool), value, fhir_obs_id (link a Observation). |
streaks | Racha general + por pilar. Campos clave: current_count, best_count, freeze_used, freeze_month. |
subscriptions | Tier (free / pro), billing_period (monthly/annual), stripe_customer_id, status. |
achievements | Logros desbloqueados. type ∈ {streak_7, streak_21, streak_30, streak_60, streak_90, phase_1, phase_2, phase_3, program_complete}. |
user_patient_map | Bridge user_id ↔ Patient/{id} FHIR. |
routine_packs + routine_items | Rutinas curadas (read-only). |
weeks | Reflexión semanal por user/year/week. |
daily_suggestions | Insights post-check-in (AI, solo Pro). |
escape_pods | Acciones rápidas curadas. |
Tablas en fhir
Sección titulada «Tablas en fhir»fhir_resources (single-table FHIR):
id(UUID)resource_type(text)resource(JSONB con el recurso completo)subject_ref(text, ej.Patient/{id})- Índices por
(subject_ref, resource_type).
Vitales soportados (FHIR Observation)
Sección titulada «Vitales soportados (FHIR Observation)»| Tipo | LOINC | Notas |
|---|---|---|
| Presión arterial | múltiples | sys/dia |
| Altura | 8302-2 | cm |
| Peso | 29463-7 | kg |
| BMI | 39156-5 | calculado |
| Temperatura | 8310-5 | °C |
| Glucosa | 2339-0 | mg/dL |
| FC | 8867-4 | bpm |
| SpO₂ | 2708-6 | % |
| Energía | 87706-6 (LOINC) | escala 1-5 |
| Mood | 285854004 (SNOMED) | escala 1-5 |
Schema public:
user_id = auth.uid()Schema fhir:
subject.reference = current_patient_ref()current_patient_ref() es un function bridge que mapea auth.uid() →
user_patient_map.patient_ref.
Patrones de almacenamiento
Sección titulada «Patrones de almacenamiento»- IDs: UUID en todas las tablas.
- FHIR resources: JSONB completo (no normalizamos campos individuales).
- FK con cascada:
daily_log_entries.daily_log_id→daily_logs.id ON DELETE CASCADE. - Sin ORM: queries directas vía Supabase JS client desde el worker Hono.