Saltar al contenido principal
Versión: Próxima

Modelo de datos

Las tablas siguientes están tomadas de las migraciones del servidor (server/internal/storage/sql/migrations/) y del esquema espejo del cliente (app/src/lib/local/schema.ts). Los nombres de columna son idénticos en ambos lados y son las claves usadas en las cargas de sincronización. Las columnas de enumeración almacenan el número proto; la etiqueta visible es lo que muestra la aplicación (app/src/lib/i18n/locales/en.json).

Cada tabla sincronizada lleva tres columnas de contabilidad que no se repiten abajo: organization_id (espacio/tenant), field_hlc (reloj de campos en JSON, consulta el protocolo de sincronización) y deleted (marca de borrado lógico). Los id son UUID, acuñados en el dispositivo o por el servidor para las filas creadas a través de la API. Las marcas de tiempo se almacenan como cadenas ISO 8601 en el cliente y como TIMESTAMP en el servidor.

Jerarquía​

apiary
└── hive ── queen (one active, older ones kept with replaced_at set)
├── inspection
├── task (task.hive_id and task.apiary_id are both optional)
├── harvest
├── treatment
├── placement (which apiary the hive lived in, and when)
└── event (append-only history with frozen apiary/hive/queen)

La compartición y la partición de la sincronización usan scope_id: el propio id del colmenar para el colmenar y todo lo que hay debajo. Solo event almacena scope_id como columna; para las demás tablas viaja en el mensaje Change.

apiary​

ColumnaTipoNotas
idtext
nametextobligatorio
addresstexttexto libre
lat, lngreal0 cuando no está definido
notetext
created_at, updated_attimestamp

hive​

ColumnaTipoNotas
idtexttambién codificado en la etiqueta QR
apiary_idtextcolmenar actual
nametext
typeintHiveType, ver abajo
statusintHiveStatus, ver abajo; las colmenas nuevas empiezan en 1
boxesintnúmero de cajas
colony_origintextp. ej. "swarm 2024"
notetext
qr_codetextreservado; el código impreso se deriva de id mediante shortCode() en app/src/lib/qr.ts
phototextdata URL o clave de blob
created_at, updated_attimestamp

HiveType: 0 Sin especificar, 1 Zander, 2 Dadant, 3 Deutsch Normal, 4 Langstroth, 5 Warré, 6 Top-bar, 99 Otro.

HiveStatus: 0 Sin especificar, 1 Activa, 2 Núcleo, 3 Sin reina, 4 Perdida, 5 Disuelta.

queen​

ColumnaTipoNotas
idtext
hive_idtext
yearintel año de la reina; determina el color de marcado por defecto
markingintMarkingColor: 1 blanco (años terminados en 1/6), 2 amarillo (2/7), 3 rojo (3/8), 4 verde (4/9), 5 azul (5/0); por defecto a partir de year
origintext
breeder_numbertext
introduced_attimestampinicio del reinado
replaced_attimestampfin del reinado, null mientras reina
activebooltrue para la reina actual
notetext
created_at, updated_attimestamp

Un cambio de reina establece active = 0 y replaced_at en la fila antigua e inserta una nueva; las reinas antiguas nunca se eliminan.

inspection​

ColumnaTipoNotas
id, hive_idtext
datetimestamp
weathertext
queen_seen, eggs_seenbool
temperamentint1 Muy mansa, 2 Mansa, 3 Normal, 4 Nerviosa, 5 Agresiva
calmnessint1 Abandona el cuadro, 2 Inquieta, 3 Tranquila, 4 Muy tranquila
framesintcuadros ocupados
brood_framesint
storesint1 Buenas, 2 Medias, 3 Bajas, 4 Ninguna
queen_cellsintceldas reales contadas
youngest_larvaintedad en días de la larva más joven vista
covered_larvaboolcría operculada vista
varroatext
honey_kg, fed_kg, weight_kgreal
frames_added, frames_removedint
drone_frame_cut, super_addedbool
temp_hive, temp_outsidereal°C, null cuando no se midió en la aplicación; CreateInspection almacena 0 para los campos omitidos
humidity_hive, humidity_outsidereal%, la misma regla que las temperaturas
notetext
photo_keystextJSON de OR-Set, la única columna de conjunto
created_attimestamp

task​

ColumnaTipoNotas
idtext
titletext
hive_id, apiary_idtextopcionales
due_attimestamp
donebool
priorityintTaskPriority: 1 Baja, 2 Normal, 3 Alta; la columna del servidor tiene 2 por defecto, la aplicación escribe 0
note, recurrence, assigned_totextpresentes en el esquema; el formulario de tarea solo rellena title y due_at
created_attimestamp

placement​

ColumnaTipoNotas
id, hive_id, apiary_idtext
start_attimestamp
end_attimestampnull para la ubicación actual

Crear una colmena abre una ubicación; moverla cierra la fila abierta en el momento del traslado y abre una nueva.

Una tarea sin apiary_id se sincroniza bajo el ámbito personal user:<user id> en lugar de un id de colmenar.

harvest​

ColumnaTipoNotas
idtext
apiary_id, hive_id, queen_idtextcongelados en el momento de la cosecha
datetimestamp
varietytext
amount_kgreal
water_contentreal%
batch_numbertext
best_beforetimestamp
notetext

treatment​

ColumnaTipoNotas
idtext
apiary_id, hive_id, queen_idtextcongelados en el momento del tratamiento
datetimestamp
product, active_ingredienttext
dose, methodtext
batch_numbertext
withdrawal_untiltimestamp
reasontextpor defecto varroa
notetext

event​

ColumnaTipoNotas
idtext
scope_idtextid del colmenar
typeintEventType, ver abajo
datetimestamp
apiary_id, hive_id, queen_idtextcongelados en el momento del evento
ref_entity, ref_idtextla fila de detalle, p. ej. harvest / su id
titletext
amount_kgrealcopiado de la cosecha para que las consultas de rendimiento no necesiten join
detailtextJSON
author_idtext

EventType: 1 Creada, 2 Reina introducida, 3 Reina reemplazada, 4 Movida, 5 Inspección, 6 Tratamiento, 7 Cosecha, 8 Estado, 9 Disuelta. La aplicación escribe los tipos 1 a 7 (app/src/lib/local/history.ts). Consulta Historial y eventos.

Tablas solo del servidor​

organization, users, member, invite, user_passkey, api_key, apiary_share, change_log y seq_counter existen solo en el servidor. member.role es owner o member; users.role es admin o user. apiary_share lo lee la comprobación de ámbitos de sincronización, pero nada en la aplicación lo escribe. El cliente añade outbox y sync_meta para el motor de sincronización.

api_key​

Claves de larga duración para scripts e integraciones (migración 0014_api_keys.sql, server/internal/auth/apikey.go). No se sincroniza.

ColumnaTipoNotas
idtext
user_idvarchar(64)propietario; indexado
organization_idvarchar(64)el espacio en el que actúa la clave, fijado al crearla
nametextetiqueta que se muestra en Ajustes
key_prefixtextlos primeros 12 caracteres del texto en claro, para mostrarlos
key_hashvarchar(64)SHA-256 en hexadecimal del token obhk_... en claro, único; el texto en claro nunca se almacena
scopetextwrite (predeterminado) o read; una clave read solo puede llamar a Get*, List*, Pull y Subscribe
created_attimestamp
expires_attimestampnull para las claves que no caducan; una clave pasado ese momento se rechaza
last_used_attimestampse actualiza en cada uso verificado, null hasta entonces

Una clave se verifica calculando el hash del token bearer y buscando key_hash; la fila se borra al eliminarla, y una clave cuyo propietario ya no es member de organization_id, o cuyo expires_at ya ha pasado, se rechaza sin borrarla.