---
title: 'Деректердің абстрактілі қабаты'
section: 'Concepts'
weight: 2
description: Деректердің абстрактілі қабаты, бірыңғай жүйелік деректер моделі, жабдықты абстракциялау және қолданбаларды физикалық сақтаудан ажырататын деректерді нормалау.
related:
  - basic-modules/modules
  - data-representation/components
  - architecture/data-collection-layer
  - rest-api
---

Деректердің абстрактілі қабаты деректердің физикалық сақталуы мен оларды пайдаланатын қолданбалардың арасында орналасады. Ол физикалық іске асырылуы мен аппараттық ерекшеліктерін абстракциялап, деректермен жұмыс істеудің бірыңғай интерфейсін ұсынады. Ол мынаны қамтамасыз етеді:

- **Аппараттық тәуелсіздік**: Деректер әртүрлі құрылғыларда (серверлерде, бұлтта, IoT құрылғыларында) сақталады, бірақ қолданба олармен бірыңғай интерфейс арқылы әрекеттеседі.
- **Әзірлеуді жеңілдету**: Әзірлеушілер физикалық сақтаудың егжей-тегжейіне алаңдамай, абстрактілі нысандармен жұмыс істейді.
- **Икемділік**: Деректердің физикалық құрылымына енгізілген өзгерістер (мысалы, бұлтқа көшу) қолданбаларға әсер етпейді.

## Бірыңғай деректер моделі

Жүйе әртүрлі жабдық түрлеріне бейімделген және олардың дереккөзіне немесе жабдық түріне қарамастан, олармен біркелкі жұмыс істеуге мүмкіндік беретін бірыңғай деректер моделін пайдаланады. Ол ортақ деректер құрылымдарын, біркелкі өңдеу ережелерін және барлық жүйелер мен ішкі жүйелер бойынша деректердің семантикалық сәйкестігін қамтиды.

Мысалы, бірыңғай жүйелік деректер моделі мынаны қамтиды:

- **Нысандар**: Жабдық, арналар, сеанстар, өлшем бірліктері және анықтамалық параметрлер.
- **Байланыстар**: Жабдықтың арналары бар, арналар деректермен байланысты, ал деректер сеанстармен байланысты.
- **Атрибуттар**: Әр нысан үшін атрибуттар анықталады (мысалы, `equipment.serial_number` және `channel_data.value`).

### Бірыңғай жүйелік деректер моделінің құрылымы

Бірыңғай жүйелік деректер моделі — жабдыққа, арналарға, сеанстарға және өлшемдерге қатысты деректерді сақтауға және басқаруға арналған құрылым. Әр кестені және оның мақсатын, сондай-ақ олардың арасындағы байланыстарды қарастырайық.

#### `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`                        | Оқиға уақыты (мысалы, timestamp).                |
| `value`           | `character varying(100)`         | Арнадан алынған мән.                             |
| `created_at`      | `timestamp(6) without time zone` | Жазба жасалған уақыт.                            |
| `updated_at`      | `timestamp(6) without time zone` | Жазба соңғы рет жаңартылған уақыт.               |

Байланыстар:

- `unit_id` сыртқы кілті `units` кестесіне сілтеме жасайды.
- `archive_type_id` сыртқы кілті `referenceparameters` кестесіне сілтеме жасайды.
- `equipment_id` сыртқы кілті `equipment` кестесіне сілтеме жасайды.
- `channel_id` сыртқы кілті `channels` кестесіне сілтеме жасайды.
- `seance_id` сыртқы кілті `seances` кестесіне сілтеме жасайды.

#### `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` | Жазба соңғы рет жаңартылған уақыт.               |

#### `referenceparameters` кестесі

Бұл кесте архив түрлері немесе басқа біліктілік белгілері сияқты анықтамалық параметрлерді сақтайды.

| Өріс                | Түрі                             | Сипаттамасы                                      |
| ------------------- | -------------------------------- | ------------------------------------------------ |
| `id`                | `bigint`                         | Жазбаның бірегей идентификаторы (бастапқы кілт). |
| `name`              | `character varying(30)`          | Өлшем бірлігінің атауы.                          |
| `varname`           | `character varying(30)`          | Өлшем бірлігінің қысқа айнымалы атауы.           |
| `description`       | `character varying(100)`         | Өлшем бірлігінің сипаттамасы.                    |
| `parent_id`         | `integer`                        | Аталық параметрге сілтеме (иерархия).            |
| `referencemodel_id` | `integer`                        | Анықтамалық модельге сілтеме.                    |
| `created_at`        | `timestamp(6) without time zone` | Жазба жасалған уақыт.                            |
| `updated_at`        | `timestamp(6) without time zone` | Жазба соңғы рет жаңартылған уақыт.               |
| `deleted_at`        | `timestamp(6) without time zone` | Жазба жойылған уақыт (жұмсақ жою).               |

Байланыстар:

- `parent_id` сыртқы кілті осы кестенің өзіне сілтеме жасайды (`referenceparameters.id`), бұл иерархияларды құруға мүмкіндік береді.

#### `equipment` кестесі

| Өріс                | Түрі                             | Сипаттамасы                                      |
| ------------------- | -------------------------------- | ------------------------------------------------ |
| `id`                | `bigint`                         | Жазбаның бірегей идентификаторы (бастапқы кілт). |
| `equipment_type_id` | `bigint`                         | Жабдық түріне сілтеме.                           |
| `serial_number`     | `character varying(25)`          | Жабдықтың сериялық нөмірі.                       |
| `manufacture_date`  | `timestamp(6) without time zone` | Жабдықтың шығарылған күні.                       |
| `installation_date` | `timestamp(6) without time zone` | Жабдықтың орнатылған күні.                       |
| `program_version`   | `character varying(100)`         | Жабдықтың бағдарламалық жасақтамасының нұсқасы.  |
| `created_at`        | `timestamp(6) without time zone` | Жазба жасалған уақыт.                            |
| `updated_at`        | `timestamp(6) without time zone` | Жазба соңғы рет жаңартылған уақыт.               |

#### `channels` кестесі

Бұл кесте жабдық арналары туралы ақпаратты сақтайды.

| Өріс                | Түрі                             | Сипаттамасы                                      |
| ------------------- | -------------------------------- | ------------------------------------------------ |
| `id`                | `bigint`                         | Жазбаның бірегей идентификаторы (бастапқы кілт). |
| `equipment_type_id` | `bigint`                         | Жабдық түріне сілтеме (`equipment_type.id`).     |
| `unit_id`           | `bigint`                         | Өлшем бірлігіне сілтеме (`units.id`).            |
| `name`              | `character varying(100)`         | Арна атауы.                                      |
| `varname`           | `character varying(20)`          | Арнаның қысқа айнымалы атауы.                    |
| `created_at`        | `timestamp(6) without time zone` | Жазба жасалған уақыт.                            |
| `updated_at`        | `timestamp(6) without time zone` | Жазба соңғы рет жаңартылған уақыт.               |

Байланыстар:

- `equipment_type_id` сыртқы кілті `equipment_type` кестесіне сілтеме жасайды.
- `unit_id` сыртқы кілті `units` кестесіне сілтеме жасайды.

#### `seances` кестесі

Бұл кесте жабдықтың байланыс сеанстары туралы ақпаратты сақтайды.

| Өріс           | Түрі                             | Сипаттамасы                                      |
| -------------- | -------------------------------- | ------------------------------------------------ |
| `id`           | `bigint`                         | Жазбаның бірегей идентификаторы (бастапқы кілт). |
| `telemetry_id` | `bigint`                         | Телеметрияға сілтеме (`telemetry.id`).           |
| `event_time`   | `integer`                        | Оқиға уақыты.                                    |
| `evtid`        | `smallint`                       | Оқиға идентификаторы.                            |
| `trycnt`       | `smallint`                       | Әрекеттер саны.                                  |
| `tryfl`        | `character varying(12)`          | Әрекет жалаушасы.                                |
| `state`        | `smallint`                       | Сеанс күйі.                                      |
| `btm`          | `integer`                        | Батарея заряды.                                  |
| `rssi`         | `integer`                        | Сигнал деңгейі (егер пайдаланылса).              |
| `created_at`   | `timestamp(6) without time zone` | Жазба жасалған уақыт.                            |
| `updated_at`   | `timestamp(6) without time zone` | Жазба соңғы рет жаңартылған уақыт.               |

#### Жалпы құрылым және байланыстар

**Негізгі кесте** — `channel_data`, ол арна деректерін жабдықпен, сеанстармен және өлшем бірліктерімен байланыстырады.

**Байланыс кестелері**:

- `units` — өлшем бірліктері.
- `referenceparameters` — архив түрлері және басқа біліктілік белгілері.

**Жабдық кестелері**:

- `equipment` — жабдық туралы ақпарат.
- `channels` — жабдық арналары.

**Сеанстар кестесі** — `seances`, ол байланыс сеанстары туралы ақпаратты сақтайды.

**Пайдалану мысалы**:

- Арна деректері (`channel_data`) жабдықтан (`equipment`) нақты сеанстар (`seances`) шеңберінде келеді.
- Әр арнаның (`channels`) өзіндік өлшем бірлігі (`units`) бар.
- Архив түрі (`referenceparameters`) деректердің қалай сақталатынын немесе өңделетінін айқындайды.

### Бірыңғай модельдің артықшылықтары

Бұл деректер моделі әртүрлі жабдықтан алынған деректерді сақтау мен талдау үшін икемділік пен ауқымдылықты қамтамасыз етеді.

Бірыңғай деректер моделінің кейбір артықшылықтары:

- **Тұрақтылық**: Деректер барлық жүйелерде бірдей құрылымға және семантикаға ие.
- **Ауқымдылық**: Жаңа дереккөздерді немесе жабдық түрлерін қосу оңай.
- **Деректерді қорғау**: Бірыңғай аутентификация, авторизация және шифрлау тетіктері.
- **Талдауды жеңілдету**: Деректерді бірыңғай құралдармен талдауға болады.

## Жабдықты абстракциялау

Жабдықты абстракциялау — деректерді өңдеу логикасын жабдықтың физикалық сипаттамаларынан ажырататын жүйенің негізгі жобалау қағидаты. Бұл әсіресе гетерогенді құрылғыларды пайдаланатын жүйелерде маңызды.

Жабдықты абстракциялау дегеніміз — жүйенің деректерді сақтайтын немесе өңдейтін физикалық құрылғыларға тәуелсіз логикалық деңгейде өңдеуі. Бұған мыналар арқылы қол жеткізіледі:

- **Интерфейстерді біріздендіру**: Жабдыққа қарамастан, деректерге қол жеткізудің бірыңғай тәсілі.
- **Іске асыру егжей-тегжейін жасыру**: Деректердің физикалық орналасуы, тарату протоколдары және басқа техникалық аспектілер қолданбалардан жасырылады.
- **Адаптерлер**: Деректерді жабдыққа тән пішімнен бірыңғай пішімге түрлендіру.

### Жабдықты абстракциялауды іске асыру

Келесі мысал бұл тәсілдің біздің жүйемізде қалай іске асырылатынын көрсетеді. Ол IoT құрылғысынан адаптер арқылы бірыңғай деректер моделіне және API арқылы шығатын деректер жолын бақылайды.

Газ шығынының деректерін жіберетін IoT құрылғысын қарастырайық. Іске асырылған алгоритмдер бізге мынаған мүмкіндік береді:

- Деректерді құрылғыдан адаптер арқылы қабылдау.
- Оны `channel_data` құрылымына түрлендіру.
- Оны дерекқорда сақтау.
- Деректерге API арқылы қол жеткізуді қамтамасыз ету.

Әр жабдық түрі үшін құрылғыға тән протоколдарды өңдейтін және деректерді бірыңғай пішімге түрлендіретін адаптерлер жасалады.

**Мысал: деректерді түрлендіру**

IoT құрылғысы үшін деректер JSON пішімінде келуі мүмкін:

```json title="example.json"
{
  "device_id": "sensor-123",
  "timestamp": 1739950861,
  "value": 42.5
}
```

Адаптер деректерді `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);
```

Деректерге сұраныс:

```bash title="Request example"
GET /api/v1/channel_data?equipment_id=1&archive_type=daily&channel_id=3
```

Жауап:

```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
  }
]
```

### Жабдықты абстракциялаудың артықшылықтары

- **Аппараттық тәуелсіздік**: Қолданбалар деректердің физикалық тұрғыда қайда орналасқанын білместен олармен жұмыс істейді.
- **Икемділік**: Жаңа құрылғыларды оңай қосу немесе бар құрылғыларды өзгерту.
- **Әзірлеуді жеңілдету**: Әзірлеушілер аппараттық егжей-тегжейге алаңдамай, абстрактілі нысандармен жұмыс істейді.
- **Ауқымдылық**: Деректерді әртүрлі құрылғыларда сақтауға болады, бірақ жүйе біркелкі түрде жұмыс істей береді.

## Деректерді нормалау

Деректерді нормалау — дерекқордағы деректерді артықтықты барынша азайтатын және деректердің тұтастығын жақсартатын тәсілмен ұйымдастыру процесі. Деректердің абстрактілі қабаты контекстінде нормалау әртүрлі жабдық түрлері мен дереккөздерді өңдеу үшін пайдалануға болатын бірыңғай, тиімді деректер моделін құруда негізгі рөл атқарады.

Деректерді нормалау деректерді логикалық кестелерге бөліп, олардың арасында байланыстар орнатады, бұл мынаған бағытталған:

- Қайталанатын деректерді жою.
- Деректерді сүйемелдеу мен жаңартуды жеңілдету.
- Деректердің тұтастығын қамтамасыз ету.
- Сұраныстардың өнімділігін арттыру.

Жүйенің бірыңғай деректер моделі атомдық (скалярлық) мәндер тұрғысынан (үшінші) қалыпты Бойс-Кодд пішініне келтірілген. Деректер моделінің кейбір нысандары сирек кездесетін, стандартты емес атрибуттарды өңдеуді оңтайландыру үшін құрама құрылымдарды пайдаланады.

### Нормалаудың артықшылықтары

- **Артықтықты жояды**: Деректер бір жерде сақталады, бұл артықтықты азайтады.
- **Деректердің тұрақтылығы**: Деректердің тұрақтылығын сақтау жеңілдейді.
- **Икемділік**: Деректер құрылымына өзгерістер енгізу оңай.
- **Өнімділік**: Сұраныстардың өнімділігі артады (көп жағдайда).

### Деректердің абстрактілі қабаты контекстіндегі нормалау

Деректерді нормалау — деректердің абстрактілі қабатын жобалаудағы маңызды қадам.

Ол мынаған мүмкіндік береді:

- Әртүрлі жабдық түрлерін өңдеу үшін пайдалануға болатын бірыңғай деректер моделін құру.
- Деректердің артықтығы мен қайталануын жою.
- Дереккөзіне қарамастан деректердің тұтастығы мен тұрақтылығын қамтамасыз ету.
- Жаңа құрылғылар мен жүйелерді интеграциялауды жеңілдету.
