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.