---
title: 'Apstraktni podatkovni sloj'
section: 'Concepts'
weight: 2
description: Apstraktni podatkovni sloj, jedinstveni podatkovni model sustava, apstrakcija opreme i normalizacija podataka, koji zajedno odvajaju aplikacije od fizičke pohrane.
related:
  - basic-modules/modules
  - data-representation/components
  - architecture/data-collection-layer
  - rest-api
---

Apstraktni podatkovni sloj nalazi se između fizičke pohrane podataka i aplikacija koje ih koriste. Skriva fizičku implementaciju i specifičnosti hardvera, a za rad s podacima pruža jedinstveno sučelje. Sloj osigurava:

- **Neovisnost o hardveru**: podaci se pohranjuju na različitim uređajima (na poslužiteljima, u oblaku, na IoT uređajima), ali aplikacija s njima radi putem jedinstvenog sučelja.
- **Jednostavniji razvoj**: programeri rade s apstraktnim entitetima i ne moraju se baviti detaljima fizičke pohrane podataka.
- **Fleksibilnost**: promjene fizičke strukture podataka (na primjer, migracija u oblak) ne utječu na aplikacije.

## Jedinstveni podatkovni model

Sustav koristi jedinstveni podatkovni model koji je prilagođen različitim tipovima opreme i omogućuje rad s podacima na ujednačen način, bez obzira na njihov izvor ili tip opreme. Model obuhvaća zajedničke strukture podataka, ujednačena pravila obrade i semantičku dosljednost podataka u svim sustavima i podsustavima.

Na primjer, jedinstveni podatkovni model sustava sadrži:

- **Entiteti**: oprema, kanali, sesije, jedinice mjere i parametri šifrarnika.
- **Veze**: oprema ima kanale, kanali su povezani s podacima, a podaci sa sesijama.
- **Atributi**: za svaki entitet definirani su atributi (na primjer, `equipment.serial_number` i `channel_data.value`).

### Struktura jedinstvenog podatkovnog modela sustava

Jedinstveni podatkovni model sustava je struktura za pohranu podataka o opremi, kanalima, sesijama i mjerenjima te za upravljanje tim podacima. Pogledajmo svaku tablicu i njezinu namjenu, kao i veze između tablica.

#### Tablica `channel_data`

U ovoj tablici pohranjuju se podaci primljeni s kanala opreme u okviru određenih sesija.

| Polje             | Tip                              | Opis                                                |
| ----------------- | -------------------------------- | --------------------------------------------------- |
| `id`              | `bigint`                         | Jedinstveni identifikator zapisa (primarni ključ).  |
| `equipment_id`    | `bigint`                         | Referenca na opremu (`equipment.id`).               |
| `seance_id`       | `bigint`                         | Referenca na sesiju (`seances.id`).                 |
| `channel_id`      | `bigint`                         | Referenca na kanal (`channels.id`).                 |
| `unit_id`         | `bigint`                         | Referenca na jedinicu mjere (`units.id`).           |
| `archive_type_id` | `integer`                        | Referenca na tip arhive (`referenceparameters.id`). |
| `event_time`      | `integer`                        | Vrijeme događaja (npr. vremenska oznaka).           |
| `value`           | `character varying(100)`         | Vrijednost primljena s kanala.                      |
| `created_at`      | `timestamp(6) without time zone` | Vrijeme stvaranja zapisa.                           |
| `updated_at`      | `timestamp(6) without time zone` | Vrijeme posljednjeg ažuriranja zapisa.              |

Veze:

- Strani ključ `unit_id` upućuje na tablicu `units`.
- Strani ključ `archive_type_id` upućuje na tablicu `referenceparameters`.
- Strani ključ `equipment_id` upućuje na tablicu `equipment`.
- Strani ključ `channel_id` upućuje na tablicu `channels`.
- Strani ključ `seance_id` upućuje na tablicu `seances`.

#### Tablica `units`

U ovoj tablici pohranjuju se jedinice mjere koje se koriste za podatke kanala.

| Polje               | Tip                              | Opis                                               |
| ------------------- | -------------------------------- | -------------------------------------------------- |
| `id`                | `bigint`                         | Jedinstveni identifikator zapisa (primarni ključ). |
| `name`              | `character varying(30)`          | Naziv jedinice mjere.                              |
| `varname`           | `character varying(30)`          | Kratko ime varijable za jedinicu mjere.            |
| `description`       | `character varying(100)`         | Opis jedinice mjere.                               |
| `conversion_factor` | `double precision`               | Faktor pretvorbe za jedinicu mjere.                |
| `rounding`          | `smallint`                       | Broj decimalnih mjesta za zaokruživanje.           |
| `synonyms`          | `character varying[]`            | Niz sinonima za jedinicu mjere.                    |
| `created_at`        | `timestamp(6) without time zone` | Vrijeme stvaranja zapisa.                          |
| `updated_at`        | `timestamp(6) without time zone` | Vrijeme posljednjeg ažuriranja zapisa.             |

#### Tablica `referenceparameters`

U ovoj tablici pohranjuju se parametri šifrarnika, kao što su tipovi arhiva ili drugi kvalifikatori.

| Polje               | Tip                              | Opis                                               |
| ------------------- | -------------------------------- | -------------------------------------------------- |
| `id`                | `bigint`                         | Jedinstveni identifikator zapisa (primarni ključ). |
| `name`              | `character varying(30)`          | Naziv jedinice mjere.                              |
| `varname`           | `character varying(30)`          | Kratko ime varijable za jedinicu mjere.            |
| `description`       | `character varying(100)`         | Opis jedinice mjere.                               |
| `parent_id`         | `integer`                        | Referenca na nadređeni parametar (hijerarhija).    |
| `referencemodel_id` | `integer`                        | Referenca na model šifrarnika.                     |
| `created_at`        | `timestamp(6) without time zone` | Vrijeme stvaranja zapisa.                          |
| `updated_at`        | `timestamp(6) without time zone` | Vrijeme posljednjeg ažuriranja zapisa.             |
| `deleted_at`        | `timestamp(6) without time zone` | Vrijeme logičkog brisanja zapisa (soft delete).    |

Veze:

- Strani ključ `parent_id` upućuje na istu tablicu (`referenceparameters.id`), što omogućuje izgradnju hijerarhija.

#### Tablica `equipment`

| Polje               | Tip                              | Opis                                               |
| ------------------- | -------------------------------- | -------------------------------------------------- |
| `id`                | `bigint`                         | Jedinstveni identifikator zapisa (primarni ključ). |
| `equipment_type_id` | `bigint`                         | Referenca na tip opreme.                           |
| `serial_number`     | `character varying(25)`          | Serijski broj opreme.                              |
| `manufacture_date`  | `timestamp(6) without time zone` | Datum proizvodnje opreme.                          |
| `installation_date` | `timestamp(6) without time zone` | Datum ugradnje opreme.                             |
| `program_version`   | `character varying(100)`         | Verzija softvera opreme.                           |
| `created_at`        | `timestamp(6) without time zone` | Vrijeme stvaranja zapisa.                          |
| `updated_at`        | `timestamp(6) without time zone` | Vrijeme posljednjeg ažuriranja zapisa.             |

#### Tablica `channels`

U ovoj tablici pohranjuju se podaci o kanalima opreme.

| Polje               | Tip                              | Opis                                               |
| ------------------- | -------------------------------- | -------------------------------------------------- |
| `id`                | `bigint`                         | Jedinstveni identifikator zapisa (primarni ključ). |
| `equipment_type_id` | `bigint`                         | Referenca na tip opreme (`equipment_type.id`).     |
| `unit_id`           | `bigint`                         | Referenca na jedinicu mjere (`units.id`).          |
| `name`              | `character varying(100)`         | Naziv kanala.                                      |
| `varname`           | `character varying(20)`          | Kratko ime varijable za kanal.                     |
| `created_at`        | `timestamp(6) without time zone` | Vrijeme stvaranja zapisa.                          |
| `updated_at`        | `timestamp(6) without time zone` | Vrijeme posljednjeg ažuriranja zapisa.             |

Veze:

- Strani ključ `equipment_type_id` upućuje na tablicu `equipment_type`.
- Strani ključ `unit_id` upućuje na tablicu `units`.

#### Tablica `seances`

U ovoj tablici pohranjuju se podaci o komunikacijskim sesijama opreme.

| Polje          | Tip                              | Opis                                               |
| -------------- | -------------------------------- | -------------------------------------------------- |
| `id`           | `bigint`                         | Jedinstveni identifikator zapisa (primarni ključ). |
| `telemetry_id` | `bigint`                         | Referenca na telemetriju (`telemetry.id`).         |
| `event_time`   | `integer`                        | Vrijeme događaja.                                  |
| `evtid`        | `smallint`                       | Identifikator događaja.                            |
| `trycnt`       | `smallint`                       | Broj pokušaja.                                     |
| `tryfl`        | `character varying(12)`          | Indikator pokušaja.                                |
| `state`        | `smallint`                       | Status sesije.                                     |
| `btm`          | `integer`                        | Napunjenost baterije.                              |
| `rssi`         | `integer`                        | Jakost signala (ako se koristi).                   |
| `created_at`   | `timestamp(6) without time zone` | Vrijeme stvaranja zapisa.                          |
| `updated_at`   | `timestamp(6) without time zone` | Vrijeme posljednjeg ažuriranja zapisa.             |

#### Opća struktura i veze

**Glavna tablica** – `channel_data`, koja povezuje podatke kanala s opremom, sesijama i jedinicama mjere.

**Povezane tablice**:

- `units` – jedinice mjere.
- `referenceparameters` – tipovi arhiva i drugi kvalifikatori.

**Tablice opreme**:

- `equipment` – podaci o opremi.
- `channels` – kanali opreme.

**Tablica sesija** – `seances`, u kojoj se pohranjuju podaci o komunikacijskim sesijama.

**Primjer korištenja**:

- Podaci kanala (`channel_data`) stižu s opreme (`equipment`) u okviru određenih sesija (`seances`).
- Svaki kanal (`channels`) ima vlastitu jedinicu mjere (`units`).
- Tip arhive (`referenceparameters`) određuje kako podatke treba pohranjivati ili obrađivati.

### Prednosti jedinstvenog modela

Ovaj podatkovni model osigurava fleksibilnost i skalabilnost pri pohrani i analizi podataka s različite opreme.

Neke od prednosti jedinstvenog podatkovnog modela su:

- **Dosljednost**: podaci imaju istu strukturu i semantiku u svim sustavima.
- **Skalabilnost**: lako je dodati nove izvore podataka ili tipove opreme.
- **Zaštita podataka**: jedinstveni mehanizmi autentifikacije, autorizacije i šifriranja.
- **Jednostavnija analiza**: podaci se mogu analizirati jedinstvenim alatima.

## Apstrakcija opreme

Apstrakcija opreme ključno je načelo projektiranja sustava prema kojem se logika rada s podacima odvaja od fizičkih karakteristika opreme. To je posebno važno u sustavima koji koriste raznorodne uređaje.

Apstrakcija opreme znači da sustav radi s podacima na logičkoj razini koja ne ovisi o fizičkim uređajima na kojima se podaci pohranjuju ili obrađuju. To se postiže na sljedeći način:

- **Unifikacija sučelja**: jedinstven način pristupa podacima, bez obzira na opremu.
- **Skrivanje detalja implementacije**: fizička lokacija podataka, protokoli prijenosa i drugi tehnički aspekti skriveni su od aplikacija.
- **Adapteri**: pretvorba podataka iz formata specifičnog za opremu u jedinstveni format.

### Implementacija apstrakcije opreme

Sljedeći primjer pokazuje kako je ovaj pristup implementiran u našem sustavu. U njemu se prati put podataka od IoT uređaja preko adaptera u jedinstveni podatkovni model, a odatle dalje putem API-ja.

Uzmimo IoT uređaj koji šalje podatke o potrošnji plina. Implementirani algoritmi omogućuju nam da:

- primimo podatke s uređaja preko adaptera;
- pretvorimo ih u strukturu `channel_data`;
- pohranimo ih u bazu podataka;
- osiguramo pristup podacima putem API-ja.

Za svaki tip opreme izrađuju se adapteri koji podržavaju protokole specifične za uređaj i pretvaraju podatke u jedinstveni format.

**Primjer: transformacija podataka**

Podaci s IoT uređaja mogu stići u JSON formatu:

```json title="example.json"
{
  "device_id": "sensor-123",
  "timestamp": 1739950861,
  "value": 42.5
}
```

Adapter pretvara podatke u strukturu `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);
```

Zahtjev za podacima:

```bash title="Request example"
GET /api/v1/channel_data?equipment_id=1&archive_type=daily&channel_id=3
```

Odgovor:

```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
  }
]
```

### Prednosti apstrakcije opreme

- **Neovisnost o hardveru**: aplikacije rade s podacima, a da ne znaju gdje se oni fizički nalaze.
- **Fleksibilnost**: lako je dodati nove uređaje ili izmijeniti postojeće.
- **Jednostavniji razvoj**: programeri rade s apstraktnim entitetima i ne moraju se baviti detaljima hardvera.
- **Skalabilnost**: podaci se mogu pohranjivati na različitim uređajima, ali sustav i dalje radi na ujednačen način.

## Normalizacija podataka

Normalizacija podataka postupak je kojim se podaci u bazi organiziraju tako da se redundancija svede na minimum, a cjelovitost podataka poboljša. U kontekstu apstraktnog podatkovnog sloja normalizacija ima ključnu ulogu u stvaranju jedinstvenog, učinkovitog podatkovnog modela koji se može koristiti za rad s različitim tipovima opreme i izvorima podataka.

Normalizacija podataka dijeli podatke na logičke tablice i uspostavlja veze među njima kako bi se:

- uklonili duplicirani podaci;
- pojednostavnilo održavanje i ažuriranje podataka;
- osigurala cjelovitost podataka;
- poboljšale performanse upita.

Jedinstveni podatkovni model sustava doveden je u (treću) Boyce-Coddovu normalnu formu u pogledu atomarnih (skalarnih) vrijednosti. Pojedini entiteti podatkovnog modela koriste složene strukture kako bi se optimizirala obrada rijetkih, nestandardnih atributa.

### Prednosti normalizacije

- **Uklanja redundanciju**: podaci se pohranjuju na jednom mjestu, čime se smanjuje redundancija.
- **Dosljednost podataka**: lakše je održavati dosljednost podataka.
- **Fleksibilnost**: strukturu podataka lako je mijenjati.
- **Performanse**: performanse upita se poboljšavaju (u većini slučajeva).

### Normalizacija u kontekstu apstraktnog podatkovnog sloja

Normalizacija podataka važan je korak u projektiranju apstraktnog podatkovnog sloja.

Ona omogućuje da se:

- izradi jedinstveni podatkovni model koji se može koristiti za rad s različitim tipovima opreme;
- uklone redundancija i dupliciranje podataka;
- osiguraju cjelovitost i dosljednost podataka, bez obzira na njihov izvor;
- pojednostavni integracija novih uređaja i sustava.
