Datenbank-Schema

MistelMonitor verfolgt einen Offline-First Ansatz. Das bedeutet, die primäre Datenbank ist die SQLite-Datenbank (MistelMonitor.db) auf dem Endgerät. Das Backend dient lediglich als Synchronisations-Hub.

Entity Relationship Diagram (ERD)

  erDiagram
    ActionYear ||--o{ Event : "enthält"
    
    Event ||--|{ EventGroup : "hat"
    Group ||--|{ EventGroup : "ist Teil von"

    Event ||--o{ Zone : "hat Gebiete"
    Event ||--o{ Report : "enthält Berichte"
    Event ||--o{ Depot : "hat Sammelplätze"
    
    Group ||--o{ Sector : "bearbeitet"
    Group ||--o{ Report : "erstellt/bearbeitet"
    
    Sector ||--o{ Report : "beinhaltet"
    
    Report ||--o{ Image : "hat Beweisfotos"
    
    %% Tabellen-Definitionen

    ActionYear {
        string id PK
        int year
        string name
        string status
    }

    Event {
        string id PK
        string name
        string description
        date start_date
        date end_date
        string area_geojson "Polygon des Aktionsgebiets"
    }

    Group {
        string id PK
        string name "z.B. Team Rot"
    }

    EventGroup {
        string event_id PK,FK
        string group_id PK,FK
    }

    Sector {
        string id PK
        string group_id FK
        string name "z.B. Wiese A"
        string area_geojson "Polygon"
        int light_trees "Geschätzt"
        int medium_trees "Geschätzt"
        int hard_trees "Geschätzt"
    }

    Zone {
        string id PK
        string event_id FK
        string type "Sperrzone / Befallsgebiet"
        string area_geojson "Polygon"
        string severity "1-3 (bei Befall)"
    }

    Report {
        string id PK
        string event_id FK
        string group_id FK
        string sector_id FK
        float latitude
        float longitude
        string tree_type
        string severity "1-3"
        string status "erfasst, geschnitten, kontrolliert"
        string municipality "Automatisch ermittelt"
        string district "Automatisch ermittelt"
    }

    Image {
        string id PK
        string report_id FK
        string path "Lokaler Pfad"
        bool is_synced
    }

    Depot {
        string id PK
        string event_id FK
        float latitude
        float longitude
        float volume_estimate
        string status "bereit, abgeholt"
    }

Tabellen-Details

Reports (Berichte)

Die zentrale Tabelle. Jeder Eintrag repräsentiert einen erfassten Baum.

  • status: Der Lebenszyklus eines Baumes (reported -> cleared -> checked).
  • severity: Befallsstärke (1=Leicht, 2=Mittel, 3=Stark).
  • cleared_at: Zeitstempel des Schnitts.

Sectors (Wiesen)

Ein Sektor ist ein Arbeitsgebiet, das einem Group (Team) zugewiesen ist.

  • Sektoren werden vom Admin im Dashboard automatisch oder manuell erstellt.
  • Sie dienen dazu, große Events in handhabbare Aufgaben zu teilen.

Zones (Gebiete)

Zonen definieren spezielle Bereiche innerhalb eines Events.

  • Sperrzonen (Rot): Naturschutzgebiete, Gefahrenbereiche. Werden vom Slicing-Algorithmus ausgeschlossen.
  • Befallsgebiete (Grün/Orange): Markierungen von Clustern.

Synchronization

Jede Tabelle (außer statische Kataloge) besitzt die Felder:

  • is_synced (Boolean): 0 = Änderungen lokal vorhanden, Upload nötig.
  • updated_at (Timestamp): Für Konfliktlösung (Last-Write-Wins).
  • deleted_at (Timestamp): Für Soft-Delete Logik (Synchronisation von Löschungen).