# سند طراحی پایگاه داده MyEMS
> این سند برای برنامهنویسان تهیه شده و توضیح دقیقی از معماری پایگاه داده، ساختار جدول و فلسفه طراحی سیستم مدیریت انرژی MyEMS ارائه میدهد.
## فهرست مطالب
- [طراحی معماری پایگاه داده](#طراحی-معماری-پایگاه-داده)
- [توضیح دقیق پایگاه داده](#توضیح-دقیق-پایگاه-داده)
- [رابطه جریان داده](#رابطه-جریان-داده)
- [مشخصات طراحی ساختار جدول](#مشخصات-طراحی-ساختار-جدول)
---
## طراحی معماری پایگاه داده
### مفهوم طراحی
1. **جداسازی داده**: جداسازی دادهها بر اساس نوع داده و کاربرد در پایگاههای داده مختلف برای جلوگیری از بزرگ شدن بیش از حد یک پایگاه داده
2. **جداسازی خواندن و نوشتن**: دادههای تاریخی به صورت سری زمانی ذخیره میشوند که امکان پرس و جوfficient کارآمد را فراهم میکند
3. **مقیاسپذیری افقی**: پایگاههای داده بزرگ (historical_db، energy_db) میتوانند به طور مستقل مقیاسپذیر باشند
4. **استانداردهای یکپارچه**: تمام پایگاههای داده از مجموعه کاراکتری و قوانین مرتبسازی یکسان استفاده میکنند
### پیکربندی پایگاه داده
تمام پایگاههای داده به طور یکپارچه از پیکربندی زیر استفاده میکنند:
- **مجموعه کاراکتری**: `utf8mb4` (پشتیبانی از مجموعه کاراکتری UTF-8 کامل، شامل ایموجی)
- **قانون مرتبسازی**: `utf8mb4_unicode_ci` (قانون مرتبسازی یونیکد)
- **موتور ذخیرهسازی**: InnoDB (پیشفرض، پشتیبانی از تراکنشها و کلیدهای خارجی)
### قوانین نامگذاری
- **نامگذاری پایگاه داده**: `myems_{Function}_db` (حروف کوچک، جدا شده با خط پایین)
- **نامگذاری جدول**: `tbl_{Entity Name}` (حروف کوچک، جدا شده با خط پایین)
- **نامگذاری فیلد**: حروف کوچک، جدا شده با خطوط پایین، مانند `start_datetime_utc`
- **نامگذاری ایندکس**: `tbl_{Table Name}_index_{Sequence Number}`
---
## توضیح دقیق پایگاه داده
### 1. Myems_system_db (پایگاه داده پیکربندی سیستم)
**هدف**: ذخیره پیکربندیهای پایه و متادیتای سیستم، به عنوان کتابخانه پیکربندی اصلی کل سیستم.
**ویژگیها**:
- حاوی بیشترین تعداد جداول (حدود 150+ جدول)
- حجم داده نسبتاً کم است، اما ساختار پیچیده دارد
- حاوی تعداد زیادی جدول انجمنی
**طبقهبندی اصلی جداول**:
#### 1.1 جدول پیکربندی پایه
|------|------|----------|
|`tbl_energy_categories`|طبقهبندی انرژی (برق، آب، گاز، سرما، گرما و غیره)|`id`, `name`, `unit_of_measure`, `kgce`, `kgco2e`|
|`tbl_energy_items`|مقادیر فرعی مصرف انرژی (روشنایی، کولر، برق و غیره)|`id`, `name`, `energy_category_id`|
|`tbl_cost_centers`|مرکز هزینه|`id`, `name`, `external_id`|
|`tbl_data_sources`|پیکربندی منبع داده|`id`, `name`, `gateway_id`, `protocol`, `connection`|
|`tbl_protocols`|پیکربندی پروتکل|`id`, `name`, `protocol_type`|
#### 1.2 جدول مدیریت تجهیزات
|------|------|----------|
|`tbl_equipments`|اطلاعات دستگاه|`id`, `name`, `uuid`, `equipment_type_id`, `cost_center_id`|
|`tbl_combined_equipments`|دستگاه ترکیبی (ترکیب چند دستگاه)|`id`, `name`, `is_input_counted`, `is_output_counted`|
|`tbl_meters`|اطلاعات کنتور|`id`, `name`, `uuid`, `energy_category_id`, `is_counted`|
|`tbl_offline_meters`|کنتور آفلاین (ورود دستی)|`id`, `name`, `energy_category_id`|
|`tbl_virtual_meters`|کنتور مجازی (محاسبهشده)|`id`, `name`, `expression` (به فرمت JSON)|
|`tbl_points`|اطلاعات نقطه داده|`id`, `name`, `data_source_id`, `object_type`, `object_id`|
#### 1.3 جدول سازماندهی فضایی
|------|------|----------|
|`tbl_spaces`|اطلاعات فضایی (اتاق، طبقه و غیره)|`id`, `name`, `uuid`, `parent_space_id`, `area`|
|`tbl_stores`|اطلاعات فروشگاه|`id`, `name`, `uuid`, `space_id`|
|`tbl_tenants`|اطلاعات مستاجر|`id`, `name`, `uuid`, `space_id`|
|`tbl_shopfloors`|اطلاعات کارگاه|`id`, `name`, `uuid`, `space_id`|
#### 1.4 جدول رابطه انجمنی
سیستم از تعداد زیادی جدول انجمنی برای ایجاد روابط چند به چند استفاده میکند:
- `tbl_equipments_meters`: انجمن بین تجهیزات و کنتورها
- `tbl_equipments_offline_meters`: انجمن بین تجه یزات و کنتورهای آفلاین
- `tbl_equipments_virtual_meters`: انجمن بین تجهیزات و کنتورهای مجازی
- `tbl_spaces_equipments`: انجمن بین فضا و تجهیزات
- `tbl_spaces_meters`: انجمن بین فضا و کنتورها
- `tbl_combined_equipments_equipments`: انجمن بین تجهیزات ترکیبی و دستگاهها
- و غیره...
#### 1.5 لیست تجهیزات انرژی نو
|------|------|----------|
|`tbl_photovoltaic_power_stations`|نیروگاه فتوولتائیک|`id`, `name`, `capacity`, `contact_id`|
|`tbl_energy_storage_containers`|کانتینر ذخیره انرژی|`id`, `name`, `rated_capacity`, `rated_power`|
|`tbl_energy_storage_power_stations`|نیروگاه ذخیره انرژی|`id`, `name`, `rated_capacity`|
|`tbl_microgrids`|ریزشبکه|`id`, `name`, `address`|
|`tbl_charging_stations`|ایستگاه شارژ|`id`, `name`, `rated_capacity`, `rated_power`|
#### 1.6 جدول کنترل و برنامهریزی
|------|------|----------|
|`tbl_commands`|دستور کنترل|`id`, `name`, `topic`, `payload` (به فرمت JSON)|
|`tbl_control_modes`|حالت کنترل|`id`, `name`, `is_active`|
|`tbl_control_modes_times`|دوره زمانی حالت کنترل|`id`, `control_mode_id`, `start_time_of_day`, `end_time_of_day`|
#### 1.7 جدول پیکربندی دیگر
- `tbl_contacts`: اطلاعات مخاطب
- `tbl_distribution_systems`: سیستمهای توزیع
- `tbl_distribution_circuits`: مدارهای توزیع
- `tbl_energy_flow_diagrams`: دیاگرام جریان انرژی
- `tbl_tariffs`: پیکربندی قیمتگذاری برق
- `tbl_working_calendars`: تقویم کار
- `tbl_web_messages`: پیامهای وب
**نکات توسعه**:
- تمام جداول دارای `id` (BIGINT AUTO-INCREMENT) به عنوان کلید اصلی هستند
- اکثر جداول دارای فیلد `uuid` (CHAR(36)) برای یکپارچهسازی سیستمهای خارجی هستند
- جداول انجمنی معمولاً فقط دارای `id` و دو فیلد کلید خارجی هستند
- فیلدهای JSON از نوع `LONGTEXT` برای ذخیره رشتههای JSON فرمتبندیشده استفاده میکنند
---
### 2. Myems_historics_db (پایگاه داده دادههای تاریخی)
**هدف**: ذخیره دادههای نظارت بلادرنگ و دادههای تاریخی، و یکی از بزرگترین پایگاههای داده از نظر حجم داده سیستم است.
**ویژگیها**:
- حجم داده بسیار زیاد است و از ذخیرهسازی سری زمانی استفاده میشود
- حاوی دادههای خام و جدول کشه مقادیر آخرین
- پشتیبانی از برچسبگذاری کیفیت داده (`is_bad`, `is_published`)
**ساختار اصلی جدول**:
|------|------|----------|----------|
|`tbl_analog_value`|دادههای تاریخی آنالوگ|`point_id`, `utc_date_time`, `actual_value`, `is_bad`, `is_published`|`(point_id, utc_date_time)`, `(utc_date_time)`|
|`tbl_analog_value_latest`|آخرین مقدار آنالوگ (کشه)|`point_id`, `utc_date_time`, `actual_value`|`(point_id, utc_date_time)`|
|`tbl_digital_value`|دادههای تاریخی دیجیتال|`point_id`, `utc_date_time`, `actual_value` (INT)|`(point_id, utc_date_time)`, `(utc_date_time)`|
|`tbl_digital_value_latest`|آخرین مقدار عددی (کشه)|`point_id`, `utc_date_time`, `actual_value`|`(point_id, utc_date_time)`|
|`tbl_energy_value`|دادههای تاریخی مصرف انرژی|`point_id`, `utc_date_time`, `actual_value`, `is_bad`, `is_published`|`(point_id, utc_date_time)`, `(utc_date_time)`|
|`tbl_energy_value_latest`|آخرین مقدار مصرف انرژی (کشه)|`point_id`, `utc_date_time`, `actual_value`|`(point_id, utc_date_time)`|
|`tbl_text_value`|دادههای تاریخی حجم متنی|`point_id`, `utc_date_time`, `actual_value` (LONGTEXT)|`(point_id, utc_date_time)`, `(utc_date_time)`|
|`tbl_text_value_latest`|آخرین مقدار حجم متنی (کشه)|`point_id`, `utc_date_time`, `actual_value`|`(point_id, utc_date_time)`|
**جدول ذخیرهسازی فایل**:
|------|------|----------|
|`tbl_cost_files`|سند هزینه (Excel/CSV)|`file_name`, `uuid`, `upload_datetime_utc`, `status`, `file_object` (LONGBLOB)|
|`tbl_offline_meter_files`|فایل داده کنتور آفلاین|`file_name`, `uuid`, `upload_datetime_utc`, `status`, `file_object`|
|`tbl_data_repair_files`|فایل تعمیر داده|`file_name`, `uuid`, `upload_datetime_utc`, `status`, `file_object`|
|`tbl_energy_plan_files`|سند برنامه مصرف انرژی|`file_name`, `uuid`, `upload_datetime_utc`, `status`, `file_object`|
**توضیح نوع داده**:
- `actual_value`: DECIMAL(21,6) - پشتیبانی از مقادیر عددی با دقت بالا و 6 رقم اعشار
- `utc_date_time`: DATETIME - زمان UTC، تمام زمانها به طور یکپارچه از UTC استفاده میکنند
- `is_bad`: BOOL - برچسب کیفیت داده، True نشاندهنده داده بد است
- `is_published`: BOOL - پرچم انتشار، True نشاندهنده انتشار شده است
**نکات توسعه**:
- تمام فیلدهای زمانی از زمان UTC استفاده میکنند و نمایش فرانتاند به زمان محلی تبدیل میشود
- جدول `_latest` برای پرس و جوfficient سریع آخرین مقادیر استفاده میشود و از اسکن جداول تاریخی جلوگیری میکند
- جدول فایل از `LONGBLOB` برای ذخیره فایلهای باینری استفاده میکند، لطفاً به محدودیتهای اندازه توجه کنید
- به طور منظم دادههای تاریخی را پاک کنید تا از بزرگ شدن بیش از حد جداول و تاثیر بر عملکرد جلوگیری کنید
---
### 3. Myems_energy_db (پایگاه داده مصرف انرژی)
**هدف**: ذخیره آمار مصرف انرژی berbagai دستگاه و تجمیع آنها بر اساس ساعت، روز، ماه و سال.
**ویژگیها**:
- دادهها توسط سرویس `myems-aggregation` محاسبه و تولید میشوند
- بر اساس ریزدرد زمانی به جداول ساعتی، روزانه، ماهانه و سالانه تقسیم میشوند
- پشتیبانی از آمار بر اساس دسته انرژی و مورد مصرف انرژی
**قوانین نامگذاری جدول**:
- `tbl_{Object Type}_{Direction}_{Classification}_{Time Granularity}`
- نوع شیء: `meter`, `equipment`, `combined_equipment`, `space`, `store`, `tenant`, `shopfloor`
- جهت: `input` (ورودی), `output` (خروجی)
- دستهبندی: `category` (دسته انرژی), `item` (مورد فرعی مصرف انرژی)
- ریزدرد زمانی: `hourly`, `daily`, `monthly`, `yearly`
**ساختار اصلی جدول**:
#### 3.1 کنتور مصرف انرژی
|------|------|----------|
|`tbl_meter_hourly`|مصرف ساعتی انرژی کنتور|`meter_id`, `start_datetime_utc`, `actual_value`|
|`tbl_meter_daily`|مصرف روزانه انرژی کنتور|`meter_id`, `start_datetime_utc`, `actual_value`|
|`tbl_meter_monthly`|مصرف ماهانه انرژی کنتور|`meter_id`, `start_datetime_utc`, `actual_value`|
|`tbl_meter_yearly`|مصرف سالانه انرژی کنتور|`meter_id`, `start_datetime_utc`, `actual_value`|
|`tbl_offline_meter_hourly`|مصرف ساعتی انرژی ک نتور آفلاین|`offline_meter_id`, `start_datetime_utc`, `actual_value`|
|`tbl_virtual_meter_hourly`|مصرف ساعتی انرژی کنتور مجازی|`virtual_meter_id`, `start_datetime_utc`, `actual_value`|
#### 3.2 جدول مصرف انرژی تجهیزات
|------|------|----------|
|`tbl_equipment_input_category_hourly`|مصرف ورودی انرژی تجهیز (بر اساس دسته)|`equipment_id`, `energy_category_id`, `start_datetime_utc`, `actual_value`|
|`tbl_equipment_input_item_hourly`|مصرف ورودی انرژی تجهیز (بر اساس مورد)|`equipment_id`, `energy_item_id`, `start_datetime_utc`, `actual_value`|
|`tbl_equipment_output_category_hourly`|