Relaciones de Entidades

Esta documentación describe las relaciones entre las principales entidades del sistema de cultivo de Cannahub. Es esencial para el equipo de backend comprender estas relaciones al implementar las APIs reales.


Diagrama de Relaciones

Loading diagram...

Relaciones del Dominio de Cultivo

Crop (Cultivo)

Entidad RelacionadaCardinalidadDescripciónCascade
Seed1:1 (opcional)Semilla origen del cultivoNo eliminar
StrainN:1Cepa/variedad del cultivoNo eliminar
SpaceN:NEspacios donde crece el cultivoDesvincular
LightN:NLuces asignadas al cultivoDesvincular
Harvest1:NCosechas producidas por el cultivoEliminar en cascada
TimelineLog1:NHistorial de actividadesEliminar en cascada
// Crop entity relationships
type Crop = {
  id: string
  strain: Pick<Strain, 'id' | 'name'>  // Required reference
  seed?: { id: string; name: string }   // Optional origin
  spaces: Space[]                        // N:N relationship
  lights: Light[]                        // N:N relationship
  timeline: PlantInteractionLog[]        // 1:N embedded
  // ... other fields
}

Seed (Semilla)

Entidad RelacionadaCardinalidadDescripciónCascade
StrainN:1Variedad de la semillaNo eliminar
Crop1:NCultivos iniciados desde esta semillaNo eliminar, actualizar referencia

Harvest (Cosecha)

Entidad RelacionadaCardinalidadDescripciónCascade
CropN:1Cultivo que produjo la cosechaRequired
HarvestStorageN:NContenedores donde se almacenaDesvincular
StrainN:1 (inherited)Heredado del cultivo-

Relaciones del Dominio de Espacios

Space (Espacio)

Entidad RelacionadaCardinalidadDescripciónCascade
Sensor1:NSensores instalados en el espacioDesvincular
Light1:NLuces instaladas en el espacioDesvincular
CropN:NCultivos en el espacioDesvincular
// Space entity relationships
type Space = {
  id: string
  name: string
  sensors?: Sensor[]  // 1:N - owned by space
  lights?: Light[]    // 1:N - owned by space
  crops?: Crop[]      // N:N - referenced
  // ... other fields
}

Sensor (Sensor)

Entidad RelacionadaCardinalidadDescripciónCascade
SpaceN:1 (opcional)Espacio donde está instaladoDesvincular
SensorReading1:NLecturas históricasEliminar en cascada
SensorAlert1:NAlertas generadasEliminar en cascada

Light (Luz)

Entidad RelacionadaCardinalidadDescripciónCascade
SpaceN:1 (opcional)Espacio donde está instaladaDesvincular
CropN:NCultivos que iluminaDesvincular

Relaciones del Dominio de Almacenamiento

StorageContainer (Contenedor)

Entidad RelacionadaCardinalidadDescripciónCascade
StorageContainerN:1 (opcional)Contenedor padre (jerárquico)Restricción
StorageItem1:NItems almacenadosRestricción (no eliminar con items)
// Hierarchical container structure
type StorageContainer = {
  id: string
  name: string
  type: 'room' | 'shelf' | 'container' | 'vault'
  parentContainerId?: string  // Self-reference for hierarchy
  items: StorageItem[]        // 1:N - contained items
  // ... other fields
}

StorageItem (Item de Almacenamiento)

Entidad RelacionadaCardinalidadDescripciónCascade
StorageContainerN:1Contenedor donde está almacenadoRequired
StrainN:1Variedad del productoNo eliminar
StorageLog1:NHistorial de movimientosEliminar en cascada

StorageLog (Registro de Almacenamiento)

Entidad RelacionadaCardinalidadDescripciónCascade
StorageItemN:1Item del movimientoRequired
StorageContainerN:1 (opcional)Contenedor origen/destinoReference
UserN:1Usuario que realizó la acciónRequired

Relaciones del Dominio de Fertilización

Fertilizer (Fertilizante)

Entidad RelacionadaCardinalidadDescripciónCascade
FertilizerScheduleN:NProgramas donde se usaDesvincular
PlantStageN:NEtapas recomendadas-

FertilizerSchedule (Programa de Fertilización)

Entidad RelacionadaCardinalidadDescripciónCascade
FertilizerN:NFertilizantes incluidos-
PlantStageN:1Etapa del cultivoRequired

Consideraciones para Backend

Integridad Referencial

  1. Soft Delete vs Hard Delete: Considerar soft delete para entidades con múltiples referencias (Strain, User, Space)

  2. Validaciones de Cascade:

    • No permitir eliminar StorageContainer con items
    • No permitir eliminar Strain referenciado por productos activos
    • Desvincular Sensor de Space antes de eliminar el espacio
  3. Transacciones: Las siguientes operaciones requieren transacciones:

    • Transferencia de items entre contenedores
    • Cambio de etapa de cultivo (actualizar timeline + stage)
    • Cosecha de cultivo (crear Harvest + actualizar Crop)

Índices Recomendados

-- Crops
CREATE INDEX idx_crops_stage ON crops(stage);
CREATE INDEX idx_crops_strain_id ON crops(strain_id);
CREATE INDEX idx_crops_planted_at ON crops(planted_at);

-- Sensors
CREATE INDEX idx_sensors_space_id ON sensors(space_id);
CREATE INDEX idx_sensor_readings_sensor_id_timestamp ON sensor_readings(sensor_id, timestamp);
CREATE INDEX idx_sensor_alerts_resolved ON sensor_alerts(resolved);

-- Storage
CREATE INDEX idx_storage_items_container_id ON storage_items(container_id);
CREATE INDEX idx_storage_items_strain_id ON storage_items(strain_id);
CREATE INDEX idx_storage_items_expiration ON storage_items(expiration_date);
CREATE INDEX idx_storage_logs_item_id ON storage_logs(item_id);
CREATE INDEX idx_storage_logs_timestamp ON storage_logs(timestamp);

-- Harvests
CREATE INDEX idx_harvests_crop_id ON harvests(crop_id);
CREATE INDEX idx_harvests_status ON harvests(status);

Queries Frecuentes

  1. Dashboard de Cultivos: Crops agrupados por stage con count
  2. Alertas Activas: Sensors con alerts no resueltas, join con Space
  3. Inventario por Vencer: StorageItems ordenados por expirationDate
  4. Timeline de Cultivo: TimelineLogs de un Crop ordenados por fecha
  5. Historial de Movimientos: StorageLogs filtrados por container/item

APIs Relacionadas

Was this page helpful?