Database Schema Kamerplanter uses ArangoDB as its primary database — a multi-model system combining document and graph database capabilities. All entities are organized as document collections; relationships are modeled as edge collections in the named graph kamerplanter_graph.
Overview Metric Value Database name kamerplanter Graph name kamerplanter_graph Document collections 54 Edge collections ~75 Primary persistence ArangoDB 3.11+ Time-series data TimescaleDB (future, REQ-005) Cache / Queue Redis / Valkey
Document Collections Master Data (REQ-001) Collection Description Key fields botanical_families Plant families name (unique), common_name species Plant species scientific_name (unique), common_names, frost_sensitivity cultivars Cultivars / varieties name, species_key, genetic lineage lifecycle_configs Lifecycle definitions per species species_key, lifecycle_type growth_phases Individual growth phases name, order, lifecycle_config_key requirement_profiles Environmental requirements per phase vpd_target_kpa, temperature_day_c, ppfd nutrient_profiles Nutrient profiles per phase npk_ratio, target_ec_ms, target_ph phase_transition_rules Transition criteria between phases from_phase_key, to_phase_key, trigger_type, gdd_threshold phase_histories Log of past phase transitions entered_at, exited_at, actual_duration_days
Locations and Infrastructure (REQ-002, REQ-019) Collection Description Key fields sites Gardens, locations name, tenant_key, location_type locations Rooms, beds, zones name, parent_location_key, depth, path location_types Types for location hierarchy name, level (10 system seeds) slots Individual plant spots slot_id (unique), capacity substrates Substrate types / profiles substrate_type, ph_range, ec_capacity substrate_batches Concrete substrate batches cycles_used, ph_history, irrigation_strategy
Plant Instances and Runs (REQ-013) Collection Description Key fields plant_instances Individual plants instance_id (unique), current_phase_key, sown_at planting_runs Planting runs (groups) name, state, tenant_key planting_run_entries Entries within a run species_key, planned_count
Planting run states:
planned → active → harvesting → completed
→ cancelled
Irrigation and Fertilization (REQ-004, REQ-014) Collection Description Key fields tanks Water tanks name (unique), capacity_liters, tenant_key tank_states Point-in-time tank snapshots ec_ms, ph, volume_liters, recorded_at tank_fill_events Tank fill events filled_at, water_mix_ratio_ro_percent fertilizers Fertilizer master data product_name, brand (unique per pair), mixing_priority fertilizer_stocks Inventory levels quantity_g, expiry_date nutrient_plans Nutrient solution plans name, watering_schedule, is_template nutrient_plan_phase_entries Phase-specific plan data phase_name, target_ec_ms, fertilizer_doses feeding_events Individual feeding events plant_key, timestamp, ec_ms, ph watering_events Watering events watered_at, volume_liters watering_logs Unified watering log logged_at, plant_keys[], slot_keys[] maintenance_logs Tank maintenance records performed_at, action maintenance_schedules Maintenance plans interval_days, next_due
Pest Management — IPM (REQ-010) Collection Description Key fields pests Pest master data scientific_name (unique), common_name diseases Disease master data scientific_name (unique) treatments Treatment agents name (unique), pre_harvest_interval_days inspections Pest inspection records plant_key, inspected_at, severity treatment_applications Applied treatments plant_key, treatment_key, applied_at
Harvest (REQ-007) Collection Description Key fields harvest_indicators Harvest readiness indicators per species indicator_type, target_value harvest_observations Maturity observations plant_key, observed_at harvest_batches Harvest batches batch_id (unique), plant_key, harvested_at, wet_weight_g quality_assessments Quality evaluations overall_score, terpene_profile yield_metrics Yield metrics dry_weight_g, trim_weight_g
Tasks and Workflows (REQ-006) Collection Description Key fields workflow_templates Reusable workflow templates name (unique), trigger_phase task_templates Task templates within workflows title, due_offset_days tasks Concrete tasks plant_key, status, due_date workflow_executions Active workflow executions plant_key, started_at task_comments Task comments author_key, body task_audit_entries Audit trail per task changed_by, change_type activities Activity master data name (unique)
Authentication and Users (REQ-023) Collection Description Key fields users User accounts email (unique), account_type, is_active auth_providers Linked OAuth/OIDC providers provider, provider_user_id (unique per pair) refresh_tokens Active session tokens token_hash (unique), user_key, expires_at oidc_provider_configs OIDC provider configurations slug (unique), client_id api_keys API keys for M2M key_hash (unique), user_key
Tenants and Memberships (REQ-024) Collection Description Key fields tenants Tenants (gardens, organizations) slug (unique), name memberships User-tenant relationships user_key, tenant_key (unique per pair), role invitations Tenant invitations token_hash (unique), tenant_key, expires_at location_assignments Assignment-based write access membership_key, location_key (unique per pair)
Roles per tenant: admin, grower, viewer
Care Reminders (REQ-022) Collection Description Key fields care_profiles Care profile per plant instance care_style, watering_interval_days care_confirmations Confirmed care events reminder_type, confirmed_at
Onboarding (REQ-020) Collection Description Key fields starter_kits Pre-configured starter sets kit_id (unique), difficulty, sort_order onboarding_states Onboarding wizard progress user_key, completed_at user_preferences User preferences expertise_level, show_all_fields user_favorites Favorited species, plans, fertilizers _from (user), _to (target entity)
Miscellaneous Collection Description sensors Sensor definitions (REQ-005) import_jobs CSV import jobs (REQ-012) calendar_feeds iCal feed configurations (REQ-015) system_settings System-wide settings (singleton) external_sources External data sources (GBIF, Perenual) external_mappings Internal ↔ external ID mappings sync_runs Enrichment run protocol
Edge Collections (Graph Relationships) Master Data Graph Edge From To Meaning belongs_to_family species botanical_families Species belongs to family has_cultivar species cultivars Species has cultivar has_lifecycle species lifecycle_configs Species has lifecycle consists_of lifecycle_configs growth_phases Lifecycle consists of phases next_phase growth_phases growth_phases Phase sequence governed_by growth_phases phase_transition_rules Phase has transition rules requires_profile growth_phases requirement_profiles Phase has env. requirements uses_nutrients growth_phases nutrient_profiles Phase has nutrient profile compatible_with species species Companion planting compatibility incompatible_with species species Companion planting incompatibility rotation_after botanical_families botanical_families Crop rotation recommendation
Location Graph Edge From To Meaning contains sites, locations locations Hierarchical containment has_slot locations slots Location has plant spots filled_with slots substrate_batches Slot is filled with substrate adjacent_to slots slots Neighboring spots (companion planting)
Plant Instance Graph Edge From To Meaning placed_in plant_instances slots Plant occupies slot grown_in plant_instances substrate_batches Plant grows in substrate current_phase plant_instances growth_phases Current phase of plant phase_history_edge plant_instances phase_histories Plant's phase history follows_plan plant_instances nutrient_plans Plant follows nutrient plan
Planting Run Graph Edge From To Meaning run_contains planting_runs plant_instances Run contains plants run_at_location planting_runs locations Run at location run_uses_substrate planting_runs substrate_batches Run uses substrate has_entry planting_runs planting_run_entries Run has entries run_follows_plan planting_runs nutrient_plans Watering schedule assignment
Tank and Fertilization Graph Edge From To Meaning has_tank locations tanks Location has tank supplies tanks locations Tank supplies location feeds_from tanks tanks Tank-to-tank cascade has_state tanks tank_states Tank state snapshots has_fill_event tanks tank_fill_events Tank fill events mixed_into nutrient_plans tank_fill_events Nutrient plan in fill event fert_incompatible fertilizers fertilizers Incompatible fertilizer pairs has_component fertilizers fertilizers Multi-component fertilizer has_stock fertilizers fertilizer_stocks Inventory level fed_by plant_instances feeding_events Plant received feeding feeding_used feeding_events fertilizers Feeding used fertilizer has_phase_entry nutrient_plans nutrient_plan_phase_entries Plan has phase entries plan_uses_fertilizer nutrient_plan_phase_entries fertilizers Plan entry uses fertilizer
IPM Graph Edge From To Meaning inspected_by plant_instances inspections Pest inspections detected_pest inspections pests Pest identified detected_disease inspections diseases Disease identified applied_to_plant treatment_applications plant_instances Treatment applied to plant treatment_uses treatment_applications treatments Treatment uses agent targets_pest treatments pests Agent targets pest contraindicated_with treatments treatments Agents not compatible vulnerable_in_phase growth_phases pests, diseases Susceptibility per phase
Harvest Graph Edge From To Meaning has_harvest_indicator species harvest_indicators Harvest indicators per species observed_for_harvest plant_instances harvest_observations Ripeness observations harvested_as plant_instances harvest_batches Plant became a batch assessed_by_quality harvest_batches quality_assessments Quality assessment has_yield_metric harvest_batches yield_metrics Yield metrics
Task Graph Edge From To Meaning wf_contains workflow_templates task_templates Workflow contains task templates has_task plant_instances tasks Plant has open task task_blocks tasks tasks Task blocks follow-up task instance_of tasks task_templates Task is instance of template task_assigned_to tasks users Task assigned to user task_uses_activity tasks, task_templates activities Task is an activity
Tenant Graph Edge From To Meaning has_membership tenants memberships Tenant has memberships membership_in users memberships User has membership belongs_to_tenant sites, plant_instances, planting_runs, tanks, fertilizers, nutrient_plans, tasks tenants Resource belongs to tenant assigned_to_location location_assignments locations Assignment-based location access
Indexes Kamerplanter automatically creates the following indexes on startup:
Collection Index field Type Unique species scientific_name Hash Yes botanical_families name Hash Yes slots slot_id Hash Yes plant_instances instance_id Hash Yes users email Hash Yes tenants slug Hash Yes memberships user_key, tenant_key Hash Yes fertilizers product_name, brand Hash Yes harvest_batches batch_id Hash Yes tanks name Hash Yes refresh_tokens token_hash Hash Yes calendar_feeds token Hash Yes tasks status, plant_key Hash No feeding_events plant_key, timestamp Hash No
Tenant Data Isolation All tenant-bound resources carry a tenant_key field. The FastAPI dependency require_permission() automatically checks on each request whether the requesting user is a member of the corresponding tenant.
Global resources (no tenant binding): species, cultivars, botanical_families, pests, diseases, treatments, starter_kits
Tenant-bound resources : sites, locations, plant_instances, planting_runs, tanks, fertilizers, nutrient_plans, tasks
Technical Notes for Developers Collections and the named graph are automatically created and migrated by ensure_collections() at backend startup. Add new collections or edge definitions to collections.py — they are created on the next startup. AQL queries use FOR ... IN GRAPH kamerplanter_graph exclusively for graph traversals. _key and _id are ArangoDB-internal identifiers. Application keys (e.g. instance_id) are separate fields with hash indexes. See Also