---
title: 'Componenti di unificazione'
section: 'Concepts'
weight: 2
description: Gli elementi costitutivi dell'unificazione dei dati — standardizzazione del formato, unificazione della struttura, unificazione semantica, normalizzazione e utilizzo dei dati unificati.
related:
  - architecture/abstract-data-layer
  - basic-modules/modules
  - data-representation/main-goals
  - rest-api
---

## Standardizzazione del formato

Tutti i dati provenienti da fonti diverse vengono convertiti in un unico formato.

Ad esempio, i dati provenienti dai dispositivi IoT arrivano in formato JSON:

```json title="example.json"
{
  "device_id": "sensor-123",
  "temp": 27.3,
  "time": 1739960923
}
```

## Unificazione della struttura dei dati

Viene definita un'unica struttura per tutti i dati, indipendentemente dalla loro origine.

Tutti i dati sono archiviati nella tabella `channel_data`, che li associa all'apparecchiatura, alle sessioni, ai canali e alle unità di misura:

| Campo             | Tipo                             | Descrizione                                                 |
| ----------------- | -------------------------------- | ----------------------------------------------------------- |
| `id`              | `bigint`                         | Identificatore univoco del record (chiave primaria).        |
| `equipment_id`    | `bigint`                         | Riferimento all'apparecchiatura (`equipment.id`).           |
| `seance_id`       | `bigint`                         | Riferimento alla sessione (`seances.id`).                   |
| `channel_id`      | `bigint`                         | Riferimento al canale (`channels.id`).                      |
| `unit_id`         | `bigint`                         | Riferimento all'unità di misura (`units.id`).               |
| `archive_type_id` | `integer`                        | Riferimento al tipo di archivio (`referenceparameters.id`). |
| `event_time`      | `integer`                        | L'orario dell'evento (ad es. timestamp).                    |
| `value`           | `character varying(100)`         | Il valore ricevuto dal canale.                              |
| `created_at`      | `timestamp(6) without time zone` | Orario di creazione del record.                             |
| `updated_at`      | `timestamp(6) without time zone` | Orario dell'ultimo aggiornamento del record.                |

Dove:

- `equipment_id`: Identificatore univoco dell'apparecchiatura.
- `seance_id`: Identificatore univoco della sessione.
- `channel_id`: Identificatore univoco del canale.
- `unit_id`: Identificatore univoco dell'unità di misura.

Quando i dati provenienti da dispositivi diversi vengono archiviati in un repository centrale:

- i dati vengono convertiti in un unico formato e in un'unica struttura;
- vengono archiviati nella tabella dei dati unificati `channel_data`.

## Unificazione semantica

Tutti i dati hanno lo stesso significato e la stessa interpretazione in tutti i sistemi.

Ad esempio:

- Tutti i timestamp sono in formato `UTC`. Questo è stato implementato in fase di progettazione del sistema.
- Tutti i sistemi utilizzano le stesse unità di misura (ad es. gradi Celsius).

Per unificare le unità di misura, al sistema è stato aggiunto il modello Units. Esso memorizza le unità di misura utilizzate per i dati dei canali.

| Campo               | Tipo                             | Descrizione                                          |
| ------------------- | -------------------------------- | ---------------------------------------------------- |
| `id`                | `bigint`                         | Identificatore univoco del record (chiave primaria). |
| `name`              | `character varying(30)`          | Nome dell'unità di misura.                           |
| `varname`           | `character varying(30)`          | Nome breve della variabile per l'unità di misura.    |
| `description`       | `character varying(100)`         | Descrizione dell'unità di misura.                    |
| `conversion_factor` | `double precision`               | Fattore di conversione per un'unità di misura.       |
| `rounding`          | `smallint`                       | Numero di cifre decimali a cui arrotondare.          |
| `synonyms`          | `character varying[]`            | Array di sinonimi per l'unità di misura.             |
| `created_at`        | `timestamp(6) without time zone` | Orario di creazione del record.                      |
| `updated_at`        | `timestamp(6) without time zone` | Orario dell'ultimo aggiornamento del record.         |

## Normalizzazione dei dati

Il modello dati del sistema è ricondotto alla forma normale di Boyce-Codd (terza) in termini di valori atomici (scalari). Alcune entità del modello dati utilizzano strutture composite per ottimizzare l'elaborazione di attributi rari e non standard.

I dati sono suddivisi in tabelle logiche (`equipment`, `channels`, `units`, `sessions`), il che elimina ridondanze e duplicazioni.

Ad esempio:

- La tabella `channel_data` fa riferimento alle tabelle `equipment`, `channels`, `units` e `sessions` tramite chiavi esterne.

## Utilizzo dei dati unificati

I dati unificati possono essere utilizzati per analisi, visualizzazione, apprendimento automatico e altre attività.

### Analisi dei dati tramite SQL

```sql
SELECT equipment_id, AVG(value) as avg_value
FROM channel_data
WHERE archive_type_id = 4 AND channel_id = 3
GROUP BY equipment_id
ORDER BY equipment_id
```

### Richiesta di dati tramite REST API

Esempio di richiesta:

```bash
GET /api/v1/channel_data?equipment_id=1&archive_type=daily&channel_id=3
```

Esempio di risposta:

```json
[
  {
    "id": 123,
    "equipment_id": 1,
    "seance_id": 2,
    "channel_id": 3,
    "archive_type_id": 4,
    "value": 42.5,
    "event_time": 1739950861
  }
]
```
