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 Relacionada | Cardinalidad | Descripción | Cascade |
|---|---|---|---|
| Seed | 1:1 (opcional) | Semilla origen del cultivo | No eliminar |
| Strain | N:1 | Cepa/variedad del cultivo | No eliminar |
| Space | N:N | Espacios donde crece el cultivo | Desvincular |
| Light | N:N | Luces asignadas al cultivo | Desvincular |
| Harvest | 1:N | Cosechas producidas por el cultivo | Eliminar en cascada |
| TimelineLog | 1:N | Historial de actividades | Eliminar 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 Relacionada | Cardinalidad | Descripción | Cascade |
|---|---|---|---|
| Strain | N:1 | Variedad de la semilla | No eliminar |
| Crop | 1:N | Cultivos iniciados desde esta semilla | No eliminar, actualizar referencia |
Harvest (Cosecha)
| Entidad Relacionada | Cardinalidad | Descripción | Cascade |
|---|---|---|---|
| Crop | N:1 | Cultivo que produjo la cosecha | Required |
| HarvestStorage | N:N | Contenedores donde se almacena | Desvincular |
| Strain | N:1 (inherited) | Heredado del cultivo | - |
Relaciones del Dominio de Espacios
Space (Espacio)
| Entidad Relacionada | Cardinalidad | Descripción | Cascade |
|---|---|---|---|
| Sensor | 1:N | Sensores instalados en el espacio | Desvincular |
| Light | 1:N | Luces instaladas en el espacio | Desvincular |
| Crop | N:N | Cultivos en el espacio | Desvincular |
// 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 Relacionada | Cardinalidad | Descripción | Cascade |
|---|---|---|---|
| Space | N:1 (opcional) | Espacio donde está instalado | Desvincular |
| SensorReading | 1:N | Lecturas históricas | Eliminar en cascada |
| SensorAlert | 1:N | Alertas generadas | Eliminar en cascada |
Light (Luz)
| Entidad Relacionada | Cardinalidad | Descripción | Cascade |
|---|---|---|---|
| Space | N:1 (opcional) | Espacio donde está instalada | Desvincular |
| Crop | N:N | Cultivos que ilumina | Desvincular |
Relaciones del Dominio de Almacenamiento
StorageContainer (Contenedor)
| Entidad Relacionada | Cardinalidad | Descripción | Cascade |
|---|---|---|---|
| StorageContainer | N:1 (opcional) | Contenedor padre (jerárquico) | Restricción |
| StorageItem | 1:N | Items almacenados | Restricció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 Relacionada | Cardinalidad | Descripción | Cascade |
|---|---|---|---|
| StorageContainer | N:1 | Contenedor donde está almacenado | Required |
| Strain | N:1 | Variedad del producto | No eliminar |
| StorageLog | 1:N | Historial de movimientos | Eliminar en cascada |
StorageLog (Registro de Almacenamiento)
| Entidad Relacionada | Cardinalidad | Descripción | Cascade |
|---|---|---|---|
| StorageItem | N:1 | Item del movimiento | Required |
| StorageContainer | N:1 (opcional) | Contenedor origen/destino | Reference |
| User | N:1 | Usuario que realizó la acción | Required |
Relaciones del Dominio de Fertilización
Fertilizer (Fertilizante)
| Entidad Relacionada | Cardinalidad | Descripción | Cascade |
|---|---|---|---|
| FertilizerSchedule | N:N | Programas donde se usa | Desvincular |
| PlantStage | N:N | Etapas recomendadas | - |
FertilizerSchedule (Programa de Fertilización)
| Entidad Relacionada | Cardinalidad | Descripción | Cascade |
|---|---|---|---|
| Fertilizer | N:N | Fertilizantes incluidos | - |
| PlantStage | N:1 | Etapa del cultivo | Required |
Consideraciones para Backend
Integridad Referencial
-
Soft Delete vs Hard Delete: Considerar soft delete para entidades con múltiples referencias (Strain, User, Space)
-
Validaciones de Cascade:
- No permitir eliminar
StorageContainercon items - No permitir eliminar
Strainreferenciado por productos activos - Desvincular
SensordeSpaceantes de eliminar el espacio
- No permitir eliminar
-
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
- Dashboard de Cultivos: Crops agrupados por stage con count
- Alertas Activas: Sensors con alerts no resueltas, join con Space
- Inventario por Vencer: StorageItems ordenados por expirationDate
- Timeline de Cultivo: TimelineLogs de un Crop ordenados por fecha
- Historial de Movimientos: StorageLogs filtrados por container/item