Zum Inhalt

Datenbankschema

Kamerplanter verwendet ArangoDB als primäre Datenbank — ein Multi-Modell-System, das Dokument- und Graphdatenbank kombiniert. Alle Entitäten sind als Dokument-Collections organisiert; Beziehungen werden als Kanten-Collections im Named Graph kamerplanter_graph abgebildet.


Überblick

Kennzahl Wert
Datenbankname kamerplanter
Graph-Name kamerplanter_graph
Dokument-Collections 54
Kanten-Collections ~75
Primäre Persistenz ArangoDB 3.11+
Zeitreihendaten TimescaleDB (zukünftig, REQ-005)
Cache / Queue Redis / Valkey

Dokument-Collections

Stammdaten (REQ-001)

Collection Beschreibung Wichtige Felder
botanical_families Botanische Familien name (unique), common_name
species Pflanzenarten scientific_name (unique), common_names, frost_sensitivity
cultivars Sorten / Varietäten name, species_key, genetische Herkunft
lifecycle_configs Lebenszyklusdefinitionen pro Art species_key, lifecycle_type
growth_phases Einzelne Wachstumsphasen name, order, lifecycle_config_key
requirement_profiles Umgebungsanforderungen je Phase vpd_target_kpa, temperature_day_c, ppfd
nutrient_profiles Nährstoffprofile je Phase npk_ratio, target_ec_ms, target_ph
phase_transition_rules Übergangskriterien zwischen Phasen from_phase_key, to_phase_key, trigger_type, gdd_threshold
phase_histories Protokoll vergangener Phasenübergänge entered_at, exited_at, actual_duration_days

Standorte und Infrastruktur (REQ-002, REQ-019)

Collection Beschreibung Wichtige Felder
sites Gärten, Standorte name, tenant_key, location_type
locations Räume, Beete, Zonen name, parent_location_key, depth, path
location_types Typen für Standorthierarchie name, level (10 System-Seeds)
slots Einzelne Pflanzplätze slot_id (unique), capacity
substrates Substrattypen/-profile substrate_type, ph_range, ec_capacity
substrate_batches Konkrete Substrat-Batches cycles_used, ph_history, irrigation_strategy

Pflanzinstanzen und Durchläufe (REQ-013)

Collection Beschreibung Wichtige Felder
plant_instances Einzelne Pflanzen instance_id (unique), current_phase_key, sown_at
planting_runs Pflanzdurchläufe (Gruppen) name, state, tenant_key
planting_run_entries Einträge eines Durchlaufs species_key, planned_count

Zustände eines Pflanzdurchlaufs:

planned → active → harvesting → completed
                             → cancelled

Bewässerung und Düngung (REQ-004, REQ-014)

Collection Beschreibung Wichtige Felder
tanks Wassertanks name (unique), capacity_liters, tenant_key
tank_states Messzeitpunkt-Snapshots eines Tanks ec_ms, ph, volume_liters, recorded_at
tank_fill_events Befüllereignisse filled_at, water_mix_ratio_ro_percent
fertilizers Dünger-Stammdaten product_name, brand (unique je Paar), mixing_priority
fertilizer_stocks Lagerbestände quantity_g, expiry_date
nutrient_plans Nährlösungspläne name, watering_schedule, is_template
nutrient_plan_phase_entries Phasenbezogene Plandaten phase_name, target_ec_ms, fertilizer_doses
feeding_events Einzelne Gabe-Ereignisse plant_key, timestamp, ec_ms, ph
watering_events Bewässerungsereignisse watered_at, volume_liters
watering_logs Einheitliches Bewässerungsprotokoll logged_at, plant_keys[], slot_keys[]
maintenance_logs Wartungsprotokolle für Tanks performed_at, action
maintenance_schedules Wartungspläne interval_days, next_due

Pflanzenschutz — IPM (REQ-010)

Collection Beschreibung Wichtige Felder
pests Schädlings-Stammdaten scientific_name (unique), common_name
diseases Krankheits-Stammdaten scientific_name (unique)
treatments Behandlungsmittel name (unique), pre_harvest_interval_days
inspections Befallskontrollen plant_key, inspected_at, severity
treatment_applications Durchgeführte Behandlungen plant_key, treatment_key, applied_at

Ernte (REQ-007)

Collection Beschreibung Wichtige Felder
harvest_indicators Erntereife-Indikatoren je Art indicator_type, target_value
harvest_observations Beobachtungen zur Reife plant_key, observed_at
harvest_batches Ernte-Chargen batch_id (unique), plant_key, harvested_at, wet_weight_g
quality_assessments Qualitätsbewertungen overall_score, terpene_profile
yield_metrics Ertragskennzahlen dry_weight_g, trim_weight_g

Aufgaben und Workflows (REQ-006)

Collection Beschreibung Wichtige Felder
workflow_templates Wiederverwendbare Workflow-Vorlagen name (unique), trigger_phase
task_templates Aufgaben-Vorlagen innerhalb Workflows title, due_offset_days
tasks Konkrete Aufgaben plant_key, status, due_date
workflow_executions Aktive Workflow-Ausführungen plant_key, started_at
task_comments Kommentare an Aufgaben author_key, body
task_audit_entries Audit-Trail je Aufgabe changed_by, change_type
activities Aktivitäts-Stammdaten name (unique)

Authentifizierung und Benutzer (REQ-023)

Collection Beschreibung Wichtige Felder
users Benutzerkonten email (unique), account_type, is_active
auth_providers Verbundene OAuth/OIDC-Provider provider, provider_user_id (unique je Paar)
refresh_tokens Aktive Sitzungs-Tokens token_hash (unique), user_key, expires_at
oidc_provider_configs OIDC-Provider-Konfigurationen slug (unique), client_id
api_keys API-Schlüssel für M2M key_hash (unique), user_key

Mandanten und Mitgliedschaften (REQ-024)

Collection Beschreibung Wichtige Felder
tenants Mandanten (Gärten, Organisationen) slug (unique), name
memberships Nutzer-Mandant-Beziehungen user_key, tenant_key (unique je Paar), role
invitations Einladungen zu Mandanten token_hash (unique), tenant_key, expires_at
location_assignments Zuweisungsbasierte Schreibrechte membership_key, location_key (unique je Paar)

Rollen je Mandant: admin, grower, viewer

Pflegeerinnerungen (REQ-022)

Collection Beschreibung Wichtige Felder
care_profiles Pflegeprofil je Pflanzinstanz care_style, watering_interval_days
care_confirmations Bestätigte Pflegeereignisse reminder_type, confirmed_at

Onboarding (REQ-020)

Collection Beschreibung Wichtige Felder
starter_kits Vorkonfigurierte Starter-Sets kit_id (unique), difficulty, sort_order
onboarding_states Fortschritt des Onboarding-Wizards user_key, completed_at
user_preferences Nutzerpräferenzen expertise_level, show_all_fields
user_favorites Favorisierte Arten, Pläne, Dünger _from (user), _to (target entity)

Sonstiges

Collection Beschreibung
sensors Sensor-Definitionen (REQ-005)
import_jobs CSV-Import-Aufträge (REQ-012)
calendar_feeds iCal-Feed-Konfigurationen (REQ-015)
system_settings Systemweite Einstellungen (Singleton)
external_sources Externe Datenquellen (GBIF, Perenual)
external_mappings Mappings interne ↔ externe IDs
sync_runs Protokoll der Anreicherungs-Läufe

Kanten-Collections (Graph-Beziehungen)

Stammdaten-Graph

Kante Von Nach Bedeutung
belongs_to_family species botanical_families Art gehört zur Familie
has_cultivar species cultivars Art hat Sorte
has_lifecycle species lifecycle_configs Art hat Lebenszyklus
consists_of lifecycle_configs growth_phases Lebenszyklus besteht aus Phasen
next_phase growth_phases growth_phases Phasenreihenfolge
governed_by growth_phases phase_transition_rules Phase hat Übergangsregeln
requires_profile growth_phases requirement_profiles Phase hat Umgebungsanforderungen
uses_nutrients growth_phases nutrient_profiles Phase hat Nährstoffprofil
compatible_with species species Mischkultur-Kompatibilität
incompatible_with species species Mischkultur-Unverträglichkeit
rotation_after botanical_families botanical_families Fruchtfolge-Empfehlung

Standort-Graph

Kante Von Nach Bedeutung
contains sites, locations locations Hierarchische Containment-Beziehung
has_slot locations slots Standort hat Pflanzplätze
filled_with slots substrate_batches Slot ist mit Substrat befüllt
adjacent_to slots slots Benachbarte Pflanzplätze (für Mischkultur)

Pflanzinstanz-Graph

Kante Von Nach Bedeutung
placed_in plant_instances slots Pflanze steht in Slot
grown_in plant_instances substrate_batches Pflanze wächst in Substrat
current_phase plant_instances growth_phases Aktuelle Phase der Pflanze
phase_history_edge plant_instances phase_histories Phasenhistorie der Pflanze
follows_plan plant_instances nutrient_plans Pflanze folgt Nährlösungsplan

Pflanzdurchlauf-Graph

Kante Von Nach Bedeutung
run_contains planting_runs plant_instances Durchlauf enthält Pflanzen
run_at_location planting_runs locations Durchlauf am Standort
run_uses_substrate planting_runs substrate_batches Durchlauf verwendet Substrat
has_entry planting_runs planting_run_entries Durchlauf hat Einträge
run_follows_plan planting_runs nutrient_plans Gießplan-Zuordnung

Tank- und Düngungsgraph

Kante Von Nach Bedeutung
has_tank locations tanks Standort hat Tank
supplies tanks locations Tank versorgt Standort
feeds_from tanks tanks Tank-zu-Tank-Kaskade
has_state tanks tank_states Tank-Zustandsprotokolle
has_fill_event tanks tank_fill_events Tank-Befüllereignisse
mixed_into nutrient_plans tank_fill_events Nährlösung in Befüllereignis
fert_incompatible fertilizers fertilizers Inkompatible Dünger-Paare
has_component fertilizers fertilizers Multi-Komponenten-Dünger
has_stock fertilizers fertilizer_stocks Lagerbestand
fed_by plant_instances feeding_events Pflanze wurde gedüngt
feeding_used feeding_events fertilizers Gabe verwendete Dünger
has_phase_entry nutrient_plans nutrient_plan_phase_entries Plan hat Phaseneinträge
plan_uses_fertilizer nutrient_plan_phase_entries fertilizers Planeintrag verwendet Dünger

IPM-Graph

Kante Von Nach Bedeutung
inspected_by plant_instances inspections Befallskontrollen
detected_pest inspections pests Festgestellter Schädling
detected_disease inspections diseases Festgestellte Krankheit
applied_to_plant treatment_applications plant_instances Behandlung an Pflanze
treatment_uses treatment_applications treatments Behandlung verwendet Mittel
targets_pest treatments pests Mittel wirkt gegen Schädling
contraindicated_with treatments treatments Mittel nicht kombinierbar
vulnerable_in_phase growth_phases pests, diseases Anfälligkeit je Phase

Ernte-Graph

Kante Von Nach Bedeutung
has_harvest_indicator species harvest_indicators Ernteindikatoren je Art
observed_for_harvest plant_instances harvest_observations Reife-Beobachtungen
harvested_as plant_instances harvest_batches Pflanze wurde zur Charge
assessed_by_quality harvest_batches quality_assessments Qualitätsbewertung
has_yield_metric harvest_batches yield_metrics Ertragsmetriken

Aufgaben-Graph

Kante Von Nach Bedeutung
wf_contains workflow_templates task_templates Workflow enthält Aufgabenvorlagen
has_task plant_instances tasks Pflanze hat offene Aufgabe
task_blocks tasks tasks Aufgabe blockiert Folgeaufgabe
instance_of tasks task_templates Aufgabe ist Instanz einer Vorlage
task_assigned_to tasks users Aufgabe zugewiesen an Nutzer
task_uses_activity tasks, task_templates activities Aufgabe ist eine Aktivität

Mandanten-Graph

Kante Von Nach Bedeutung
has_membership tenants memberships Mandant hat Mitgliedschaften
membership_in users memberships Nutzer hat Mitgliedschaft
belongs_to_tenant sites, plant_instances, planting_runs, tanks, fertilizers, nutrient_plans, tasks tenants Ressource gehört zu Mandant
assigned_to_location location_assignments locations Zuweisungsbasierter Standortzugriff

Indizes

Kamerplanter legt beim Start automatisch folgende Indizes an:

Collection Index-Feld Typ Eindeutig
species scientific_name Hash Ja
botanical_families name Hash Ja
slots slot_id Hash Ja
plant_instances instance_id Hash Ja
users email Hash Ja
tenants slug Hash Ja
memberships user_key, tenant_key Hash Ja
fertilizers product_name, brand Hash Ja
harvest_batches batch_id Hash Ja
tanks name Hash Ja
refresh_tokens token_hash Hash Ja
calendar_feeds token Hash Ja
tasks status, plant_key Hash Nein
feeding_events plant_key, timestamp Hash Nein

Datenisolierung durch Mandanten

Alle mandantengebundenen Ressourcen tragen ein tenant_key-Feld. Der FastAPI-Dependency require_permission() prüft beim Zugriff automatisch, ob der anfragende Nutzer Mitglied des entsprechenden Mandanten ist.

Globale Ressourcen (ohne Mandantenbindung): species, cultivars, botanical_families, pests, diseases, treatments, starter_kits

Mandantengebundene Ressourcen: sites, locations, plant_instances, planting_runs, tanks, fertilizers, nutrient_plans, tasks


Technische Hinweise für Entwickler

  • Collections und der Named Graph werden beim Backend-Start durch ensure_collections() automatisch erstellt und migriert.
  • Neue Collections oder Kanten-Definitionen in collections.py eintragen — beim nächsten Start werden sie angelegt.
  • AQL-Queries verwenden ausschließlich FOR ... IN GRAPH kamerplanter_graph für Graph-Traversals.
  • _key und _id sind ArangoDB-interne Identifikatoren. Anwendungsschlüssel (z. B. instance_id) sind separate Felder mit Hash-Index.

Siehe auch