---
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`

این جدول داده‌های دریافت‌شده از کانال‌های تجهیزات در نشست‌های مشخص را ذخیره می‌کند.

| Field             | Type                             | شرح                                            |
| ----------------- | -------------------------------- | ---------------------------------------------- |
| `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` | زمان آخرین به‌روزرسانی رکورد.                  |

روابط:

- کلید خارجی `unit_id` به جدول `units` ارجاع می‌دهد.
- کلید خارجی `archive_type_id` به جدول `referenceparameters` ارجاع می‌دهد.
- کلید خارجی `equipment_id` به جدول `equipment` ارجاع می‌دهد.
- کلید خارجی `channel_id` به جدول `channels` ارجاع می‌دهد.
- کلید خارجی `seance_id` به جدول `seances` ارجاع می‌دهد.

#### جدول `units`

این جدول واحدهای اندازه‌گیری به‌کاررفته برای داده‌های کانال را ذخیره می‌کند.

| Field               | Type                             | شرح                                      |
| ------------------- | -------------------------------- | ---------------------------------------- |
| `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`

این جدول پارامترهای مرجع مانند انواع آرشیو یا دیگر مشخص‌کننده‌ها را ذخیره می‌کند.

| Field               | Type                             | شرح                                    |
| ------------------- | -------------------------------- | -------------------------------------- |
| `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`

| Field               | Type                             | شرح                             |
| ------------------- | -------------------------------- | ------------------------------- |
| `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`

این جدول اطلاعات مربوط به کانال‌های تجهیزات را ذخیره می‌کند.

| Field               | Type                             | شرح                                         |
| ------------------- | -------------------------------- | ------------------------------------------- |
| `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`

این جدول اطلاعات مربوط به نشست‌های ارتباطی تجهیزات را ذخیره می‌کند.

| Field          | Type                             | شرح                                 |
| -------------- | -------------------------------- | ----------------------------------- |
| `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
  }
]
```

### مزایای انتزاع تجهیزات

- **استقلال از سخت‌افزار**: برنامه‌ها با داده‌ها کار می‌کنند بدون آنکه بدانند داده‌ها از نظر فیزیکی کجا قرار دارند.
- **انعطاف‌پذیری**: افزودن دستگاه‌های جدید یا تغییر دستگاه‌های موجود به‌آسانی انجام می‌شود.
- **توسعهٔ ساده‌تر**: توسعه‌دهندگان با موجودیت‌های انتزاعی کار می‌کنند بدون آنکه نگران جزئیات سخت‌افزاری باشند.
- **مقیاس‌پذیری**: داده‌ها را می‌توان بر روی دستگاه‌های گوناگون ذخیره کرد، اما سامانه به‌شیوه‌ای یکسان به کار خود ادامه می‌دهد.

## نرمال‌سازی داده

نرمال‌سازی داده فرایند سازمان‌دهی داده‌ها در یک پایگاه داده به‌گونه‌ای است که افزونگی را به کمینه می‌رساند و یکپارچگی داده را بهبود می‌بخشد. در زمینهٔ لایه داده انتزاعی، نرمال‌سازی نقشی کلیدی در ایجاد یک مدل داده یکپارچه و کارآمد ایفا می‌کند که می‌توان از آن برای مدیریت انواع گوناگون تجهیزات و منابع داده استفاده کرد.

نرمال‌سازی داده، داده‌ها را به جدول‌های منطقی تقسیم می‌کند و روابطی میان آن‌ها برقرار می‌سازد تا:

- داده‌های تکراری حذف شوند.
- نگه‌داری و به‌روزرسانی داده‌ها ساده شود.
- یکپارچگی داده تضمین شود.
- کارایی پرس‌وجوها بهبود یابد.

مدل داده یکپارچهٔ سامانه از نظر مقادیر اتمی (نرده‌ای) به فرم نرمال (سوم) بویس-کاد تقلیل یافته است. برخی از موجودیت‌های مدل داده برای بهینه‌سازی مدیریت صفت‌های نادر و غیراستاندارد از ساختارهای مرکب استفاده می‌کنند.

### مزایای نرمال‌سازی

- **حذف افزونگی**: داده‌ها در یک مکان ذخیره می‌شوند و افزونگی کاهش می‌یابد.
- **سازگاری داده**: حفظ سازگاری داده‌ها ساده‌تر می‌شود.
- **انعطاف‌پذیری**: ایجاد تغییر در ساختار داده‌ها آسان است.
- **کارایی**: کارایی پرس‌وجوها بهبود می‌یابد (در بیشتر موارد).

### نرمال‌سازی در زمینهٔ لایه داده انتزاعی

نرمال‌سازی داده گامی مهم در طراحی لایه داده انتزاعی است.

این کار به شما امکان می‌دهد:

- یک مدل داده یکپارچه ایجاد کنید که می‌توان از آن برای مدیریت انواع گوناگون تجهیزات استفاده کرد.
- افزونگی و تکرار داده‌ها را حذف کنید.
- یکپارچگی و سازگاری داده‌ها را بدون توجه به منبع آن‌ها تضمین کنید.
- یکپارچه‌سازی دستگاه‌ها و سامانه‌های جدید را ساده کنید.
