Zum Inhalt

Datenmodell

Datenmodell

Logische Stores

erDiagram
    SECTIONS ||--o{ FIELDS : enthaelt
    ENTRIES ||--o{ ENTRY_VALUES : besitzt
    FIELDS ||--o{ ENTRY_VALUES : definiert
    CATALOG_ITEMS ||--o{ EVENTS : klassifiziert
    EVENTS ||--o{ RESETS : kann_ausloesen
    PROFILES ||--o{ COUNTERS : besitzt
    PROFILES }o--o{ EVENTS : betrifft
Store Inhalt Schlüsselidee
meta Laufzeitkonfiguration, Sprache, UI-Zustand, Datenschutz Schlüssel/Wert-Metadaten
sections sichtbare Bereiche des Tages-Check-ins Reihenfolge, Label, Radar-Achse
fields versionierte Felddefinitionen stabile IDs und logicalId
entries ein Tagesdatensatz pro Datum sparse values-Map
catalogItems Personen, Sportarten, Mahlzeiten, Trigger wiederverwendbare Katalogobjekte
events wiederholbare Ereignisse sozial, Sport, Selbstfürsorge, Mahlzeit, Urge, Trigger
resets Counter-Startpunkte und Rückfälle Historie statt Überschreiben
todos Aufgaben Status, Priorität, Deadline
inventoryEntries Reflexionen des Recovery-Programmkontexts schema-kompatibel erhalten; in General Audience ausgeblendet
chats, chatMessages Companion-Konversationen getrennt von Trackingdaten

Tagesdatensatz

{
  "id": "2026-07-21",
  "date": "2026-07-21",
  "values": {
    "sleep_quality": 4,
    "stress": 4,
    "day_management": 3
  },
  "createdAt": "...",
  "updatedAt": "...",
  "source": "app"
}

Die values-Map ist sparse. Ein nicht vorhandener Schlüssel bedeutet unbekannt. Das ist semantisch etwas anderes als 0, false oder "no".

Dynamische Ereignisse

Wiederholbare Dinge werden nicht in den Tagesdatensatz gepresst. Drei soziale Kontakte an einem Tag sind drei events, können aber dieselbe Person aus catalogItems referenzieren.

{
  "id": "social-...",
  "kind": "social",
  "date": "2026-07-21",
  "catalogItemId": "person-anna",
  "connection": 4,
  "note": "kurzer Austausch"
}

Laufzeitkonfiguration

loadAppData() verbindet eingebaute Standardkonfiguration mit lokal gespeicherten Änderungen. Die UI erhält dadurch ein konsistentes Objekt mit Daten, Konfiguration und Präferenzen.

Bei einer frischen general-audience-Datenbank werden nur die aktuellen Bereiche und Felder angelegt. ensureConfiguration() ergänzt dort fehlende aktuelle Definitionen, injiziert aber keine fehlenden Legacy-Felder. Bereits vorhandene historische Felddefinitionen werden weiterhin normalisiert und bleiben zusammen mit ihren Tageswerten erhalten. Dasselbe gilt nach einem validierten Backup-Import.

Quellen