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

Apstraktni sloj podataka nalazi se između fizičkog skladišta podataka i aplikacija koje ih koriste. Skriva fizičku implementaciju i specifičnosti hardvera, a za rad sa podacima pruža jedinstven interfejs. Sloj obezbeđuje:

- **Nezavisnost od hardvera**: podaci se čuvaju na različitim uređajima (na serverima, u oblaku, na IoT uređajima), ali aplikacija sa njima radi preko jedinstvenog interfejsa.
- **Jednostavniji razvoj**: programeri rade sa apstraktnim entitetima i ne moraju da se bave detaljima fizičkog skladištenja podataka.
- **Fleksibilnost**: promene fizičke strukture podataka (na primer, migracija u oblak) ne utiču na aplikacije.

## Jedinstveni model podataka

Sistem koristi jedinstveni model podataka koji je prilagođen različitim tipovima opreme i omogućava da se sa podacima radi na ujednačen način, bez obzira na njihov izvor ili tip opreme. Model obuhvata zajedničke strukture podataka, ujednačena pravila obrade i semantičku doslednost podataka u svim sistemima i podsistemima.

Na primer, jedinstveni model podataka sistema sadrži:

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

### Struktura jedinstvenog modela podataka sistema

Jedinstveni model podataka sistema je struktura za čuvanje podataka o opremi, kanalima, sesijama i merenjima i za upravljanje tim podacima. Pogledajmo svaku tabelu i njenu namenu, kao i veze između tabela.

#### Tabela `channel_data`

U ovoj tabeli čuvaju se podaci primljeni sa 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 mere (`units.id`).            |
| `archive_type_id` | `integer`                        | Referenca na tip arhive (`referenceparameters.id`). |
| `event_time`      | `integer`                        | Vreme događaja (npr. vremenska oznaka).             |
| `value`           | `character varying(100)`         | Vrednost primljena sa kanala.                       |
| `created_at`      | `timestamp(6) without time zone` | Vreme kreiranja zapisa.                             |
| `updated_at`      | `timestamp(6) without time zone` | Vreme poslednjeg ažuriranja zapisa.                 |

Veze:

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

#### Tabela `units`

U ovoj tabeli čuvaju se jedinice mere koje se koriste za podatke kanala.

| Polje               | Tip                              | Opis                                               |
| ------------------- | -------------------------------- | -------------------------------------------------- |
| `id`                | `bigint`                         | Jedinstveni identifikator zapisa (primarni ključ). |
| `name`              | `character varying(30)`          | Naziv jedinice mere.                               |
| `varname`           | `character varying(30)`          | Kratko ime promenljive za jedinicu mere.           |
| `description`       | `character varying(100)`         | Opis jedinice mere.                                |
| `conversion_factor` | `double precision`               | Faktor konverzije za jedinicu mere.                |
| `rounding`          | `smallint`                       | Broj decimalnih mesta za zaokruživanje.            |
| `synonyms`          | `character varying[]`            | Niz sinonima za jedinicu mere.                     |
| `created_at`        | `timestamp(6) without time zone` | Vreme kreiranja zapisa.                            |
| `updated_at`        | `timestamp(6) without time zone` | Vreme poslednjeg ažuriranja zapisa.                |

#### Tabela `referenceparameters`

U ovoj tabeli čuvaju se parametri šifarnika, kao što su tipovi arhiva ili drugi kvalifikatori.

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

Veze:

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

#### Tabela `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` | Vreme kreiranja zapisa.                            |
| `updated_at`        | `timestamp(6) without time zone` | Vreme poslednjeg ažuriranja zapisa.                |

#### Tabela `channels`

U ovoj tabeli čuvaju 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 mere (`units.id`).           |
| `name`              | `character varying(100)`         | Naziv kanala.                                      |
| `varname`           | `character varying(20)`          | Kratko ime promenljive za kanal.                   |
| `created_at`        | `timestamp(6) without time zone` | Vreme kreiranja zapisa.                            |
| `updated_at`        | `timestamp(6) without time zone` | Vreme poslednjeg ažuriranja zapisa.                |

Veze:

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

#### Tabela `seances`

U ovoj tabeli čuvaju se podaci o komunikacionim sesijama opreme.

| Polje          | Tip                              | Opis                                               |
| -------------- | -------------------------------- | -------------------------------------------------- |
| `id`           | `bigint`                         | Jedinstveni identifikator zapisa (primarni ključ). |
| `telemetry_id` | `bigint`                         | Referenca na telemetriju (`telemetry.id`).         |
| `event_time`   | `integer`                        | Vreme 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`                        | Jačina signala (ako se koristi).                   |
| `created_at`   | `timestamp(6) without time zone` | Vreme kreiranja zapisa.                            |
| `updated_at`   | `timestamp(6) without time zone` | Vreme poslednjeg ažuriranja zapisa.                |

#### Opšta struktura i veze

**Glavna tabela** – `channel_data`, koja povezuje podatke kanala sa opremom, sesijama i jedinicama mere.

**Povezane tabele**:

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

**Tabele opreme**:

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

**Tabela sesija** – `seances`, u kojoj se čuvaju podaci o komunikacionim sesijama.

**Primer korišćenja**:

- Podaci kanala (`channel_data`) stižu sa opreme (`equipment`) u okviru određenih sesija (`seances`).
- Svaki kanal (`channels`) ima sopstvenu jedinicu mere (`units`).
- Tip arhive (`referenceparameters`) određuje kako podatke treba čuvati ili obrađivati.

### Prednosti jedinstvenog modela

Ovaj model podataka obezbeđuje fleksibilnost i skalabilnost pri čuvanju i analizi podataka sa različite opreme.

Neke od prednosti jedinstvenog modela podataka su:

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

## Apstrakcija opreme

Apstrakcija opreme je ključni princip projektovanja sistema po kojem se logika rada sa podacima odvaja od fizičkih karakteristika opreme. To je posebno važno u sistemima koji koriste raznorodne uređaje.

Apstrakcija opreme znači da sistem radi sa podacima na logičkom nivou koji ne zavisi od fizičkih uređaja na kojima se podaci čuvaju ili obrađuju. To se postiže na sledeći način:

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

### Implementacija apstrakcije opreme

Sledeći primer pokazuje kako je ovaj pristup implementiran u našem sistemu. U njemu se prati put podataka od IoT uređaja preko adaptera u jedinstveni model podataka, a odatle dalje preko interfejsa API.

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

- primimo podatke sa uređaja preko adaptera;
- konvertujemo ih u strukturu `channel_data`;
- sačuvamo ih u bazi podataka;
- obezbedimo pristup podacima preko interfejsa API.

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

**Primer: transformacija podataka**

Podaci sa IoT uređaja mogu da stignu u formatu JSON:

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

Adapter konvertuje 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);
```

Zahtev 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

- **Nezavisnost od hardvera**: aplikacije rade sa podacima, a da ne znaju gde se oni fizički nalaze.
- **Fleksibilnost**: lako je dodati nove uređaje ili izmeniti postojeće.
- **Jednostavniji razvoj**: programeri rade sa apstraktnim entitetima i ne moraju da se bave detaljima hardvera.
- **Skalabilnost**: podaci mogu da se čuvaju na različitim uređajima, ali sistem i dalje radi na ujednačen način.

## Normalizacija podataka

Normalizacija podataka je postupak kojim se podaci u bazi organizuju tako da se redundantnost svede na minimum, a integritet podataka poboljša. U kontekstu apstraktnog sloja podataka normalizacija ima ključnu ulogu u stvaranju jedinstvenog, efikasnog modela podataka koji može da se koristi za rad sa različitim tipovima opreme i izvorima podataka.

Normalizacija podataka deli podatke na logičke tabele i uspostavlja veze između njih kako bi se:

- uklonili duplirani podaci;
- pojednostavilo održavanje i ažuriranje podataka;
- obezbedio integritet podataka;
- poboljšale performanse upita.

Jedinstveni model podataka sistema doveden je u (treću) Bojs-Kodovu normalnu formu u pogledu atomičnih (skalarnih) vrednosti. Pojedini entiteti modela podataka koriste složene strukture kako bi se optimizovala obrada retkih, nestandardnih atributa.

### Prednosti normalizacije

- **Uklanja redundantnost**: podaci se čuvaju na jednom mestu, čime se smanjuje redundantnost.
- **Doslednost podataka**: lakše je održavati doslednost podataka.
- **Fleksibilnost**: strukturu podataka je lako menjati.
- **Performanse**: performanse upita se poboljšavaju (u većini slučajeva).

### Normalizacija u kontekstu apstraktnog sloja podataka

Normalizacija podataka je važan korak u projektovanju apstraktnog sloja podataka.

Ona omogućava da se:

- izradi jedinstveni model podataka koji može da se koristi za rad sa različitim tipovima opreme;
- uklone redundantnost i dupliranje podataka;
- obezbede integritet i doslednost podataka, bez obzira na njihov izvor;
- pojednostavi integracija novih uređaja i sistema.
