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