---
title: 'Компоненти уніфікації'
section: 'Concepts'
weight: 2
description: Будівельні блоки уніфікації даних — стандартизація формату, уніфікація структури, семантична уніфікація, нормалізація та використання уніфікованих даних.
related:
  - architecture/abstract-data-layer
  - basic-modules/modules
  - data-representation/main-goals
  - rest-api
---

## Стандартизація формату

Усі дані, що надходять із різних джерел, перетворюються на єдиний формат.

Наприклад, дані від пристроїв IoT надходять у форматі JSON:

```json title="example.json"
{
  "device_id": "sensor-123",
  "temp": 27.3,
  "time": 1739960923
}
```

## Уніфікація структури даних

Для всіх даних визначено єдину структуру, незалежно від їх джерела.

Усі дані зберігаються в таблиці `channel_data`, яка пов’язує їх з обладнанням, сеансами, каналами та одиницями вимірювання:

| Поле              | Тип                              | Опис                                                |
| ----------------- | -------------------------------- | --------------------------------------------------- |
| `id`              | `bigint`                         | Унікальний ідентифікатор запису (первинний ключ).   |
| `equipment_id`    | `bigint`                         | Посилання на обладнання (`equipment.id`).           |
| `seance_id`       | `bigint`                         | Посилання на сеанс (`seances.id`).                  |
| `channel_id`      | `bigint`                         | Посилання на канал (`channels.id`).                 |
| `unit_id`         | `bigint`                         | Посилання на одиницю вимірювання (`units.id`).      |
| `archive_type_id` | `integer`                        | Посилання на тип архіву (`referenceparameters.id`). |
| `event_time`      | `integer`                        | Час події (наприклад, мітка часу).                  |
| `value`           | `character varying(100)`         | Значення, отримане з каналу.                        |
| `created_at`      | `timestamp(6) without time zone` | Час створення запису.                               |
| `updated_at`      | `timestamp(6) without time zone` | Час останнього оновлення запису.                    |

Де:

- `equipment_id`: Унікальний ідентифікатор обладнання.
- `seance_id`: Унікальний ідентифікатор сеансу.
- `channel_id`: Унікальний ідентифікатор каналу.
- `unit_id`: Унікальний ідентифікатор одиниці вимірювання.

Коли дані від різних пристроїв зберігаються в центральному сховищі:

- дані перетворюються на єдиний формат і структуру;
- вони зберігаються в уніфікованій таблиці даних `channel_data`.

## Семантична уніфікація

Усі дані мають однакове значення та тлумачення в усіх системах.

Наприклад:

- Усі мітки часу подано у форматі `UTC`. Це було реалізовано на етапі проєктування системи.
- Усі системи використовують однакові одиниці вимірювання (наприклад, градуси Цельсія).

Для уніфікації одиниць вимірювання до системи було додано модель Units. Вона зберігає одиниці вимірювання, що використовуються для даних каналів.

| Поле                | Тип                              | Опис                                              |
| ------------------- | -------------------------------- | ------------------------------------------------- |
| `id`                | `bigint`                         | Унікальний ідентифікатор запису (первинний ключ). |
| `name`              | `character varying(30)`          | Назва одиниці вимірювання.                        |
| `varname`           | `character varying(30)`          | Коротке змінне ім’я одиниці вимірювання.          |
| `description`       | `character varying(100)`         | Опис одиниці вимірювання.                         |
| `conversion_factor` | `double precision`               | Коефіцієнт перетворення для одиниці вимірювання.  |
| `rounding`          | `smallint`                       | Кількість десяткових знаків для округлення.       |
| `synonyms`          | `character varying[]`            | Масив синонімів для одиниці вимірювання.          |
| `created_at`        | `timestamp(6) without time zone` | Час створення запису.                             |
| `updated_at`        | `timestamp(6) without time zone` | Час останнього оновлення запису.                  |

## Нормалізація даних

Модель даних системи зведено до нормальної форми Бойса-Кодда (третьої) у частині атомарних (скалярних) значень. Деякі сутності моделі даних використовують складені структури для оптимізації роботи з рідкісними, нестандартними атрибутами.

Дані поділено на логічні таблиці (`equipment`, `channels`, `units`, `sessions`), що усуває надмірність та дублювання.

Наприклад:

- Таблиця `channel_data` посилається на таблиці `equipment`, `channels`, `units` та `sessions` через зовнішні ключі.

## Використання уніфікованих даних

Уніфіковані дані можна використовувати для аналізу, візуалізації, машинного навчання та інших завдань.

### Аналіз даних за допомогою 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
```

### Запит даних через REST API

Приклад запиту:

```bash
GET /api/v1/channel_data?equipment_id=1&archive_type=daily&channel_id=3
```

Приклад відповіді:

```json
[
  {
    "id": 123,
    "equipment_id": 1,
    "seance_id": 2,
    "channel_id": 3,
    "archive_type_id": 4,
    "value": 42.5,
    "event_time": 1739950861
  }
]
```
