Passa al contenuto principale
Versione: 0.2.2

Modello dei dati

Questa pagina descrive le entità principali che Openbeehive memorizza, come si relazionano tra loro e come gli scope decidono cosa viene sincronizzato e con chi. È scritta dal punto di vista offline-first: la stessa struttura risiede nel database SQLite-WASM del dispositivo e nel database modulare del server, e il protocollo di sincronizzazione li mantiene allineati.

Se ti interessano i meccanismi del tracciamento delle modifiche (timestamp HLC, last-writer-wins, OR-Set, eventi append-only), leggi prima Storico ed eventi — questa pagina si concentra sulle entità stesse.

La gerarchia​

In cima si trova l'Apiario (una postazione o un luogo). Ogni apiario contiene Arnie; ogni arnia ha una Regina attuale e accumula nel tempo un flusso di registrazioni.

Apiary
├── Hive ──────── Queen (current; queens form a succession over time)
│ ├── Inspection (a visit: what you saw)
│ ├── Task (something to do, with a due date)
│ ├── Event (append-only fact: requeened, split, died, moved…)
│ ├── Harvest (honey/wax taken off)
│ └── Treatment (varroa or disease treatment applied)
│
└── Placement (hive ↔ apiary, time-bounded — where a hive lived, and when)

ApiaryShare (apiary ↔ user — grants another beekeeper access via a scope)

Un'arnia appartiene a un solo apiario alla volta, ma Placement registra lo storico completo dei luoghi in cui un'arnia ha vissuto, così un'arnia può spostarsi tra le postazioni senza perdere le sue registrazioni.

Entità e campi chiave​

Ogni entità condivide un involucro comune usato dalla sincronizzazione: un id stabile (un UUID generato offline), uno scope_id (vedi Scope), colonne di gestione HLC e un flag di cancellazione logica. I campi elencati di seguito sono quelli con significato di dominio.

Apiary​

Il contenitore e l'unità di condivisione.

CampoNote
idUUID
namees. "Postazione di casa"
locationtesto libero oppure lat/long
notestesto libero
scope_idcoincide con l'id dell'apiario stesso (vedi sotto)

Hive​

L'alloggiamento di una colonia all'interno di un apiario.

CampoNote
idUUID; codificato anche nell'etichetta QR dell'arnia
apiary_idapiario attuale (la collocazione attiva)
name / short_codeetichetta leggibile e codice breve stampato sul QR
typeuno tra Zander, Dadant, Deutsch Normal, Langstroth, Warre, Top-bar, Other — vedi Tipi di arnia
statuses. attiva, morta, venduta
notestesto libero
scope_idl'id dell'apiario

Queen​

La regina regnante di un'arnia. Le regine formano una successione: quando una colonia viene risottoposta a nuova regina, la regina precedente viene chiusa e si apre una nuova registrazione, così mantieni l'intera discendenza.

CampoNote
idUUID
hive_idl'arnia che guida
yearanno di introduzione/nascita
marking_coloursegue lo schema internazionale dei colori (1/6 bianco, 2/7 giallo, 3/8 rosso, 4/9 verde, 5/0 blu)
originallevata, acquistata, sciame, sostituzione spontanea…
clippedcon ali tarpate (booleano)
scope_idl'id dell'apiario della sua arnia

Inspection​

Una visita datata: l'istantanea di ciò che hai osservato.

CampoNote
id, hive_id, datechi e quando
brood, stores, temperamentosservazioni tipiche
queen_seen, eggs_seen, queen_cellscontrolli rapidi
varroa_countcaduta di acari / conteggio da lavaggio, se rilevato
temp_hive, temp_outsidetemperatura (°C) all'interno dell'arnia e all'esterno
humidity_hive, humidity_outsideumidità relativa (%) all'interno dell'arnia e all'esterno
notestesto libero
scope_idl'id dell'apiario

I campi climatici sono semplici scalari opzionali, quindi si sincronizzano per campo come qualsiasi altra colonna e possono essere compilati a mano o da un sensore automatico — vedi Tracker automatici.

Task​

Qualcosa da fare per un'arnia o un apiario, con una data di scadenza e uno stato di completamento.

CampoNote
idUUID
hive_id / apiary_idil soggetto (un task può riferirsi a uno dei due livelli)
title, due_date, donegli elementi di base
scope_idl'id dell'apiario

Event​

Un fatto append-only relativo a un'arnia — nuova regina, divisione, sciamatura, morte, spostamento, nutrizione. Gli eventi non vengono mai modificati né uniti; si limitano ad accumularsi, motivo per cui non entrano mai in conflitto durante la sincronizzazione. Sono la spina dorsale della cronologia dell'arnia.

CampoNote
id, hive_id, occurred_atquando è accaduto
kindil tipo di evento
payloaddettaglio specifico del tipo (JSON)
scope_idl'id dell'apiario

Vedi Storico ed eventi per il catalogo completo degli eventi e per il modo in cui viene assemblata la cronologia.

Harvest​

Miele (o cera) prelevato da un'arnia.

CampoNote
id, hive_id, dateil prelievo
productmiele, cera, propoli…
quantity, unites. 12,5 kg
noteses. fonte di bottinatura, umidità
scope_idl'id dell'apiario

Treatment​

Un trattamento contro la varroa o una malattia applicato a un'arnia.

CampoNote
id, hive_id, datesoggetto e data di applicazione
product, active_ingredientes. Oxuvar / acido ossalico
dose, methodes. 50 ml, gocciolamento
batch_numberlotto / carica (spesso obbligatorio per legge)
withdrawal_untildata a partire dalla quale il miele può essere raccolto in sicurezza
reasones. varroa
notetesto libero
apiary_id, queen_idcontesto fissato al momento dell'applicazione
scope_idl'id dell'apiario
note

Le regole di trattamento e dosaggio variano in base al paese e all'autorizzazione del prodotto. Openbeehive registra ciò che hai fatto; non prescrive nulla. Segui sempre le autorizzazioni locali — vedi Varroa.

Placement​

Il collegamento limitato nel tempo tra un'arnia e un apiario: dove un'arnia ha vissuto e per quanto tempo. Una nuova collocazione si apre quando un'arnia si sposta; la precedente si chiude.

CampoNote
id, hive_id, apiary_idil collegamento
from / untilintervallo; until è null finché è in corso
scope_idl'id dell'apiario

ApiaryShare​

Concede a un altro apicoltore l'accesso a un apiario (e a tutto ciò che vi è contenuto).

CampoNote
id, apiary_idcosa viene condiviso
user_idcon chi viene condiviso
rolees. visualizzatore, editor

Scope e controllo della sincronizzazione​

La condivisione avviene a livello di apiario, e un unico valore la governa: ogni registrazione porta uno scope_id.

  • Per i dati di proprietà dell'apiario — arnie, regine, ispezioni, task, eventi, raccolti, trattamenti, collocazioni e l'apiario stesso — lo scope_id è l'id dell'apiario.
  • Per i dati che appartengono a un singolo utente e non vengono mai condivisi (es. le preferenze personali), lo scope_id assume la forma user:<id>.

Quando due dispositivi si sincronizzano, si scambiano solo gli scope a cui l'utente ha diritto. Il server risolve l'insieme degli scope di un utente come:

scopes(user) = { "user:<their id>" }
∪ { apiary.id for each apiary they own }
∪ { share.apiary_id for each ApiaryShare granting them access }

Aggiungere un ApiaryShare fa quindi comparire un intero apiario — ogni arnia e ogni registrazione sotto di esso — sui dispositivi del destinatario alla sincronizzazione successiva; revocarlo interrompe il flusso di ulteriori modifiche. Poiché il controllo è la colonna scope_id, la condivisione è tutto-o-niente per apiario e non richiede permessi per singola registrazione.

suggerimento

L'id di un'arnia da solo non concede nulla. La scansione di un'etichetta QR apre l'app su un'arnia solo se lo scope di quell'arnia è stato effettivamente sincronizzato sul tuo dispositivo.

Perché si fonde in modo pulito​

Le strutture descritte sopra sono scelte in modo che la sincronizzazione non richieda mai l'intervento di una persona per risolvere un conflitto:

  • I campi scalari (il colore di marcatura di una regina, il nome di un'arnia) usano il last-writer-wins per campo, deciso dai timestamp HLC.
  • I campi lista/insieme usano OR-Set add-wins, così le aggiunte concorrenti sopravvivono tutte.
  • Gli eventi sono append-only e immutabili, quindi si limitano ad accumularsi.

Per l'algoritmo completo, prosegui con il protocollo di sincronizzazione.