---
title: 'Abstraktní datová vrstva'
section: 'Concepts'
weight: 2
description: Abstraktní datová vrstva, jednotný datový model systému, abstrakce zařízení a normalizace dat, které oddělují aplikace od fyzického úložiště.
related:
  - basic-modules/modules
  - data-representation/components
  - architecture/data-collection-layer
  - rest-api
---

Abstraktní datová vrstva se nachází mezi fyzickým úložištěm dat a aplikacemi, které je využívají. Skrývá fyzickou implementaci a specifika hardwaru a poskytuje jednotné rozhraní pro práci s daty. Nabízí:

- **Nezávislost na hardwaru**: Data jsou uložena na různých zařízeních (servery, cloud, zařízení IoT), ale aplikace s nimi pracuje prostřednictvím jednotného rozhraní.
- **Jednodušší vývoj**: Vývojáři pracují s abstraktními entitami, aniž by se museli zabývat podrobnostmi fyzického úložiště.
- **Flexibilita**: Změny ve fyzické struktuře dat (například migrace do cloudu) nemají na aplikace vliv.

## Jednotný datový model

Systém používá jednotný datový model, který je přizpůsoben různým typům zařízení a umožňuje s nimi pracovat jednotným způsobem bez ohledu na jejich zdroj nebo typ zařízení. Zahrnuje společné datové struktury, jednotná pravidla zpracování a sémantickou konzistenci dat napříč všemi systémy a subsystémy.

Jednotný datový model systému například zahrnuje:

- **Entity**: Zařízení, kanály, relace, jednotky a referenční parametry.
- **Vztahy**: Zařízení má kanály, kanály souvisejí s daty a data souvisejí s relacemi.
- **Atributy**: Atributy jsou definovány pro každou entitu (například `equipment.serial_number` a `channel_data.value`).

### Struktura jednotného datového modelu systému

Jednotný datový model systému je struktura pro ukládání a správu dat souvisejících se zařízeními, kanály, relacemi a měřeními. Podívejme se na jednotlivé tabulky a jejich účel a také na vztahy mezi nimi.

#### Tabulka `channel_data`

Tato tabulka ukládá data přijatá z kanálů zařízení v rámci konkrétních relací.

| Pole              | Typ                              | Popis                                            |
| ----------------- | -------------------------------- | ------------------------------------------------ |
| `id`              | `bigint`                         | Jedinečný identifikátor záznamu (primární klíč). |
| `equipment_id`    | `bigint`                         | Odkaz na zařízení (`equipment.id`).              |
| `seance_id`       | `bigint`                         | Odkaz na relaci (`seances.id`).                  |
| `channel_id`      | `bigint`                         | Odkaz na kanál (`channels.id`).                  |
| `unit_id`         | `bigint`                         | Odkaz na měrnou jednotku (`units.id`).           |
| `archive_type_id` | `integer`                        | Odkaz na typ archivu (`referenceparameters.id`). |
| `event_time`      | `integer`                        | Čas události (např. časové razítko).             |
| `value`           | `character varying(100)`         | Hodnota přijatá z kanálu.                        |
| `created_at`      | `timestamp(6) without time zone` | Čas vytvoření záznamu.                           |
| `updated_at`      | `timestamp(6) without time zone` | Čas poslední aktualizace záznamu.                |

Vztahy:

- Cizí klíč `unit_id` odkazuje na tabulku `units`.
- Cizí klíč `archive_type_id` odkazuje na tabulku `referenceparameters`.
- Cizí klíč `equipment_id` odkazuje na tabulku `equipment`.
- Cizí klíč `channel_id` odkazuje na tabulku `channels`.
- Cizí klíč `seance_id` odkazuje na tabulku `seances`.

#### Tabulka `units`

Tato tabulka ukládá měrné jednotky používané pro data kanálů.

| Pole                | Typ                              | Popis                                            |
| ------------------- | -------------------------------- | ------------------------------------------------ |
| `id`                | `bigint`                         | Jedinečný identifikátor záznamu (primární klíč). |
| `name`              | `character varying(30)`          | Název měrné jednotky.                            |
| `varname`           | `character varying(30)`          | Krátký název proměnné pro měrnou jednotku.       |
| `description`       | `character varying(100)`         | Popis měrné jednotky.                            |
| `conversion_factor` | `double precision`               | Převodní koeficient pro měrnou jednotku.         |
| `rounding`          | `smallint`                       | Počet desetinných míst pro zaokrouhlení.         |
| `synonyms`          | `character varying[]`            | Pole synonym pro měrnou jednotku.                |
| `created_at`        | `timestamp(6) without time zone` | Čas vytvoření záznamu.                           |
| `updated_at`        | `timestamp(6) without time zone` | Čas poslední aktualizace záznamu.                |

#### Tabulka `referenceparameters`

Tato tabulka ukládá referenční parametry, jako jsou typy archivů nebo jiné kvalifikátory.

| Pole                | Typ                              | Popis                                            |
| ------------------- | -------------------------------- | ------------------------------------------------ |
| `id`                | `bigint`                         | Jedinečný identifikátor záznamu (primární klíč). |
| `name`              | `character varying(30)`          | Název měrné jednotky.                            |
| `varname`           | `character varying(30)`          | Krátký název proměnné pro měrnou jednotku.       |
| `description`       | `character varying(100)`         | Popis měrné jednotky.                            |
| `parent_id`         | `integer`                        | Odkaz na nadřazený parametr (hierarchie).        |
| `referencemodel_id` | `integer`                        | Odkaz na model číselníku.                        |
| `created_at`        | `timestamp(6) without time zone` | Čas vytvoření záznamu.                           |
| `updated_at`        | `timestamp(6) without time zone` | Čas poslední aktualizace záznamu.                |
| `deleted_at`        | `timestamp(6) without time zone` | Čas smazání záznamu (měkké smazání).             |

Vztahy:

- Cizí klíč `parent_id` odkazuje na stejnou tabulku (`referenceparameters.id`), což umožňuje budovat hierarchie.

#### Tabulka `equipment`

| Pole                | Typ                              | Popis                                            |
| ------------------- | -------------------------------- | ------------------------------------------------ |
| `id`                | `bigint`                         | Jedinečný identifikátor záznamu (primární klíč). |
| `equipment_type_id` | `bigint`                         | Odkaz na typ zařízení.                           |
| `serial_number`     | `character varying(25)`          | Sériové číslo zařízení.                          |
| `manufacture_date`  | `timestamp(6) without time zone` | Datum výroby zařízení.                           |
| `installation_date` | `timestamp(6) without time zone` | Datum instalace zařízení.                        |
| `program_version`   | `character varying(100)`         | Verze softwaru zařízení.                         |
| `created_at`        | `timestamp(6) without time zone` | Čas vytvoření záznamu.                           |
| `updated_at`        | `timestamp(6) without time zone` | Čas poslední aktualizace záznamu.                |

#### Tabulka `channels`

Tato tabulka ukládá informace o kanálech zařízení.

| Pole                | Typ                              | Popis                                            |
| ------------------- | -------------------------------- | ------------------------------------------------ |
| `id`                | `bigint`                         | Jedinečný identifikátor záznamu (primární klíč). |
| `equipment_type_id` | `bigint`                         | Odkaz na typ zařízení (`equipment_type.id`).     |
| `unit_id`           | `bigint`                         | Odkaz na měrnou jednotku (`units.id`).           |
| `name`              | `character varying(100)`         | Název kanálu.                                    |
| `varname`           | `character varying(20)`          | Krátký název proměnné pro kanál.                 |
| `created_at`        | `timestamp(6) without time zone` | Čas vytvoření záznamu.                           |
| `updated_at`        | `timestamp(6) without time zone` | Čas poslední aktualizace záznamu.                |

Vztahy:

- Cizí klíč `equipment_type_id` odkazuje na tabulku `equipment_type`.
- Cizí klíč `unit_id` odkazuje na tabulku `units`.

#### Tabulka `seances`

Tato tabulka ukládá informace o komunikačních relacích zařízení.

| Pole           | Typ                              | Popis                                            |
| -------------- | -------------------------------- | ------------------------------------------------ |
| `id`           | `bigint`                         | Jedinečný identifikátor záznamu (primární klíč). |
| `telemetry_id` | `bigint`                         | Odkaz na telemetrii (`telemetry.id`).            |
| `event_time`   | `integer`                        | Čas události.                                    |
| `evtid`        | `smallint`                       | Identifikátor události.                          |
| `trycnt`       | `smallint`                       | Počet pokusů.                                    |
| `tryfl`        | `character varying(12)`          | Příznak pokusu.                                  |
| `state`        | `smallint`                       | Stav relace.                                     |
| `btm`          | `integer`                        | Nabití baterie.                                  |
| `rssi`         | `integer`                        | Síla signálu (pokud se používá).                 |
| `created_at`   | `timestamp(6) without time zone` | Čas vytvoření záznamu.                           |
| `updated_at`   | `timestamp(6) without time zone` | Čas poslední aktualizace záznamu.                |

#### Obecná struktura a vztahy

**Hlavní tabulka** — `channel_data`, která propojuje data kanálů se zařízeními, relacemi a jednotkami.

**Vztahové tabulky**:

- `units` — měrné jednotky.
- `referenceparameters` — typy archivů a jiné kvalifikátory.

**Tabulky zařízení**:

- `equipment` — informace o zařízeních.
- `channels` — kanály zařízení.

**Tabulka relací** — `seances`, která ukládá informace o komunikačních relacích.

**Příklad použití**:

- Data kanálů (`channel_data`) přicházejí ze zařízení (`equipment`) v rámci konkrétních relací (`seances`).
- Každý kanál (`channels`) má vlastní měrnou jednotku (`units`).
- Typ archivu (`referenceparameters`) určuje, jak mají být data ukládána nebo zpracovávána.

### Výhody jednotného modelu

Tento datový model poskytuje flexibilitu a škálovatelnost pro ukládání a analýzu dat z různých zařízení.

Mezi výhody jednotného datového modelu patří:

- **Konzistence**: Data mají stejnou strukturu a sémantiku napříč všemi systémy.
- **Škálovatelnost**: Snadno lze přidávat nové zdroje dat nebo typy zařízení.
- **Ochrana dat**: Jednotné mechanismy autentizace, autorizace a šifrování.
- **Jednodušší analýza**: Data lze analyzovat jednotnými nástroji.

## Abstrakce zařízení

Abstrakce zařízení je klíčový princip návrhu systému, který odděluje logiku práce s daty od fyzických vlastností zařízení. To je obzvláště důležité v systémech, které využívají heterogenní zařízení.

Abstrakce zařízení znamená, že systém zpracovává data na logické úrovni nezávislé na fyzických zařízeních, na nichž jsou data uložena nebo zpracovávána. Toho je dosaženo pomocí:

- **Sjednocení rozhraní**: Jednotný způsob přístupu k datům bez ohledu na zařízení.
- **Skrytí podrobností implementace**: Fyzické umístění dat, přenosové protokoly a další technické aspekty jsou před aplikacemi skryty.
- **Adaptéry**: Převod dat z formátu specifického pro zařízení do jednotného formátu.

### Implementace abstrakce zařízení

Následující příklad ukazuje, jak je tento přístup implementován v našem systému. Sleduje data ze zařízení IoT přes adaptér do jednotného datového modelu a ven prostřednictvím API.

Uvažujme zařízení IoT, které odesílá data o spotřebě plynu. Implementované algoritmy nám umožňují:

- Přijmout data ze zařízení prostřednictvím adaptéru.
- Převést je do struktury `channel_data`.
- Uložit je do databáze.
- Poskytnout přístup k datům prostřednictvím API.

Pro každý typ zařízení jsou vytvořeny adaptéry, které zpracovávají protokoly specifické pro dané zařízení a převádějí data do jednotného formátu.

**Příklad: transformace dat**

U zařízení IoT mohou data přicházet ve formátu JSON:

```json title="example.json"
{
  "device_id": "sensor-123",
  "timestamp": 1739950861,
  "value": 42.5
}
```

Adaptér převede data do struktury `channel_data`:

```sql title="example.sql"
INSERT INTO channel_data (equipment_id, seance_id, channel_id,
 archive_type_id, value, event_time)
VALUES (1, 2, 3, 4, '42.5', 1739950861);
```

Požadavek na data:

```bash title="Request example"
GET /api/v1/channel_data?equipment_id=1&archive_type=daily&channel_id=3
```

Odpověď:

```json title="Response example"
[
  {
    "id": 123,
    "equipment_id": 1,
    "seance_id": 2,
    "channel_id": 3,
    "archive_type_id": 4,
    "value": 42.5,
    "event_time": 1739950861
  }
]
```

### Výhody abstrakce zařízení

- **Nezávislost na hardwaru**: Aplikace pracují s daty, aniž by věděly, kde jsou fyzicky uložena.
- **Flexibilita**: Snadné přidávání nových zařízení nebo úprava stávajících.
- **Jednodušší vývoj**: Vývojáři pracují s abstraktními entitami, aniž by se museli zabývat podrobnostmi hardwaru.
- **Škálovatelnost**: Data lze ukládat na různých zařízeních, ale systém i nadále funguje jednotným způsobem.

## Normalizace dat

Normalizace dat je proces uspořádání dat v databázi takovým způsobem, který minimalizuje redundanci a zlepšuje integritu dat. V kontextu abstraktní datové vrstvy hraje normalizace klíčovou roli při vytváření jednotného a efektivního datového modelu, který lze použít pro práci s různými typy zařízení a zdroji dat.

Normalizace dat rozděluje data do logických tabulek a vytváří mezi nimi vztahy s cílem:

- Odstranit duplicitní data.
- Zjednodušit údržbu a aktualizaci dat.
- Zajistit integritu dat.
- Zlepšit výkon dotazů.

Jednotný datový model systému je převeden do (třetí) Boyceovy–Coddovy normální formy z hlediska atomických (skalárních) hodnot. Některé entity datového modelu používají složené struktury pro optimalizaci práce se vzácnými, nestandardními atributy.

### Výhody normalizace

- **Odstraňuje redundanci**: Data jsou uložena na jednom místě, což snižuje redundanci.
- **Konzistence dat**: Udržování konzistence dat je zjednodušeno.
- **Flexibilita**: Změny ve struktuře dat lze provádět snadno.
- **Výkon**: Výkon dotazů je zlepšen (ve většině případů).

### Normalizace v kontextu abstraktní datové vrstvy

Normalizace dat je důležitým krokem při návrhu abstraktní datové vrstvy.

Umožňuje:

- Vytvořit jednotný datový model, který lze použít pro práci s různými typy zařízení.
- Odstranit redundanci a duplicitu dat.
- Zajistit integritu a konzistenci dat bez ohledu na jejich zdroj.
- Zjednodušit integraci nových zařízení a systémů.
