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 (optional, 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, propagation_methods[] 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
Species — Feld propagation_methods Das Feld propagation_methods ist ein Array von Enum-Werten (PropagationMethod) und dokumentiert die für die Art üblichen Vermehrungsmethoden. Erlaubte Werte:
seed · cutting · division · rhizome_division · bulb · tuber · offset · grafting · layering · spore · runner · leaf_cutting · self_seeding
Das Array ist optional (Standard: leer) im SpeciesCreate-Schema und Pflichtfeld in SpeciesResponse (wird als leere Liste zurückgegeben, wenn nicht gepflegt). Alle vorgefertigten Kulturpflanzen-Seed-Daten (143 Arten) sind befüllt.
Species — Feld propagation_months Das Feld propagation_months ist ein Array von Ganzzahlen (list[int], Wertebereich 1–12) und gibt an, in welchen Monaten die vegetative Vermehrung (Teilung, Steckling, Kindel, Ausläufer o. Ä.) für die Art am besten geeignet ist. Die Monatsnummern werden serverseitig dedupliziert und aufsteigend sortiert.
Eigenschaft Wert Typ list[int] Wertebereich 1–12 (Januar–Dezember) Standard [] (leer, wenn nicht gepflegt) SpeciesCreate optional SpeciesResponse immer vorhanden (leere Liste, wenn nicht gepflegt) API PUT /api/v1/species/{key} akzeptiert und liefert das Feld
Abgrenzung: propagation_months bezieht sich ausschließlich auf vegetative Vermehrungszeitpunkte. Aussaatzeiträume (generative Vermehrung über Samen) werden über direct_sow_months, indoor_start_months und transplant_months abgebildet.
Beispiel: Anemone hupehensis (Herbst-Anemone) — propagation_months: [3, 4] (Teilung im zeitigen Frühjahr, vor dem Neuaustrieb).
Species — Feld propagation_notes Das Feld propagation_notes ist ein fachlicher Freitext und hält praxisnahes Vermehrungswissen fest, das sich nicht in strukturierten Feldern wie propagation_methods oder propagation_months abbilden lässt — typische Fehlerquellen, artspezifische Substrat- oder Temperaturanforderungen, Akklimatisierungsschritte und ähnliche Erfolgsfaktoren.
Eigenschaft Wert Typ string \| null Max. Länge 1000 Zeichen Sprache Deutsch Standard null (nicht gesetzt) SpeciesCreate optional SpeciesResponse immer vorhanden (null, wenn nicht gepflegt) API PUT /api/v1/species/{key} akzeptiert und liefert das Feld
Abgrenzung: propagation_notes ist reiner Freitext für qualitatives Erfahrungswissen. Strukturierte Zeitangaben (Monate) gehören in propagation_months, Methoden-Klassifikation in propagation_methods.
Befüllung: Alle 183 Arten mit gepflegten Vermehrungsmethoden in den Seed-Daten sind mit einem Hinweistext versehen.
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