برو به محتوای اصلی

database-design

# سند طراحی پایگاه داده 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`|مصرف خروجی انرژی تجهیز (بر اساس دسته)|`equipment_id`, `energy_category_id`, `start_datetime_utc`, `actual_value`|
|`tbl_combined_equipment_input_category_hourly`|مصرف ورودی انرژی دستگاه ترکیبی (بر اساس دسته)|`combined_equipment_id`, `energy_category_id`, `start_datetime_utc`, `actual_value`|
|`tbl_combined_equipment_output_category_hourly`|مصرف خروجی انرژی تجهیز ترکیبی (بر اساس دسته‌بندی)|`combined_equipment_id`, `energy_category_id`, `start_datetime_utc`, `actual_value`|

#### 3.3 جدول مصرف انرژی فضا

|نام جدول|توضیحات|فیلد کلیدی|
|------|------|----------|
|`tbl_space_input_category_hourly`|مصرف ورودی انرژی فضا (بر اساس دسته)|`space_id`, `energy_category_id`, `start_datetime_utc`, `actual_value`|
|`tbl_space_input_item_hourly`|مصرف ورودی انرژی فضا (بر اساس مورد)|`space_id`, `energy_item_id`, `start_datetime_utc`, `actual_value`|
|`tbl_space_output_category_hourly`|مصرف خروجی انرژی فضا (بر اساس دسته‌بندی)|`space_id`, `energy_category_id`, `start_datetime_utc`, `actual_value`|
|`tbl_store_input_category_hourly`|مصرف ورودی انرژی فروشگاه|`store_id`, `energy_category_id`, `start_datetime_utc`, `actual_value`|
|`tbl_tenant_input_category_hourly`|مصرف ورودی انرژی مستاجر|`tenant_id`, `energy_category_id`, `start_datetime_utc`, `actual_value`|
|`tbl_shopfloor_input_category_hourly`|مصرف ورودی انرژی کارگاه|`shopfloor_id`, `energy_category_id`, `start_datetime_utc`, `actual_value`|

#### 3.4 جدول مصرف انرژی تجهیزات انرژی نو

|نام جدول|توضیحات|فیلد کلیدی|
|------|------|----------|
|`tbl_photovoltaic_power_station_hourly`|تولید ساعتی برق نیروگاه فتوولتائیک|`photovoltaic_power_station_id`, `start_datetime_utc`, `actual_value`|
|`tbl_energy_storage_container_charge_hourly`|ظرفیت شارژ کانتینر ذخیره انرژی|`energy_storage_container_id`, `start_datetime_utc`, `actual_value`|
|`tbl_energy_storage_container_discharge_hourly`|ظرفیت تخلیه کانتینر ذخیره انرژی|`energy_storage_container_id`, `start_datetime_utc`, `actual_value`|
|`tbl_energy_storage_container_grid_buy_hourly`|خرید برق توسط کانتینر ذخیره انرژی از شبکه|`energy_storage_container_id`, `start_datetime_utc`, `actual_value`|
|`tbl_energy_storage_container_grid_sell_hourly`|فروش برق توسط کانتینر ذخیره انرژی به شبکه|`energy_storage_container_id`, `start_datetime_utc`, `actual_value`|
|`tbl_microgrid_charge_hourly`|ظرفیت شارژ ریزشبکه|`microgrid_id`, `start_datetime_utc`, `actual_value`|
|`tbl_microgrid_discharge_hourly`|ظرفیت تخلیه ریزشبکه|`microgrid_id`, `start_datetime_utc`, `actual_value`|

**طراحی ایندکس**:
- تمام جداول دارای ایندکس ترکیبی هستند: `(Object ID, Classification ID, start_datetime_utc)` یا `(Object ID, start_datetime_utc)`
- پشتیبانی از پرس و جوfficient سریع بر اساس شیء و محدوده زمانی

**نکات توسعه**:
- `start_datetime_utc` نشان‌دهنده زمان شروع دوره زمانی است (مثلاً 2024-01-01 00:00:00 نشان‌دهنده 1 ژانویه از 0:00 تا 1:00 است)
- `actual_value` مقدار تجمیع‌شده است، نه مقدار اصلی
- داده‌ها به طور دوره‌ای توسط سرویس تجمیع محاسبه می‌شوند، نه به صورت بلادرنگ نوشته می‌شوند
- هنگام پرس و جوfficient، به تبدیل منطقه زمانی توجه کنید

---

### 4. myems_billing_db (پایگاه داده صورتحساب)

**هدف**: ذخیره داده‌های مصرف انرژی مرتبط با صورتحساب. ساختار آن مشابه `myems_energy_db` است، اما داده‌ها بر اساس تعرفه‌های برق محاسبه می‌شوند.

**ویژگی‌ها**:
- ساختار جدول با `myems_energy_db` یکسان است
- داده‌ها توسط سرویس `myems-aggregation` با استفاده از پیکربندی‌های تعرفه محاسبه می‌شوند
- پشتیبانی از قوانین صورتحساب پیچیده مانند تعرفه‌های بر اساس زمان استفاده و قیمت‌گذاری طبقه‌ای

**جدول‌های اصلی**:
- ساختار جدول با `myems_energy_db` یکسان است
- مقادیر داده‌ها در ضرب در تعرفه مربوطه هستند، معمولاً در واحدهای ارزی (مثلاً یوان چینی، دلار آمریکا)

**نکات توسعه**:
- داده‌های صورتحساب به پیکربندی تعرفه در `myems_system_db.tbl_tariffs` بستگی دارد
- باید با مراکز هزینه (`cost_center`) مرتبط باشند
- پشتیبانی از استراتژی‌های تعرفه متعدد (بر اساس زمان استفاده، طبقه‌ای، بر اساس ظرفیت و غیره)

---

### 5. myems_carbon_db (پایگاه داده انتشار کربن)

**هدف**: ذخیره داده‌های انرژی مرتبط با انتشار کربن برای محاسبه اثر کربنی.

**ویژگی‌ها**:
- ساختار جدول با `myems_energy_db` یکسان است
- داده‌ها توسط سرویس `myems-aggregation` بر اساس ضرایب انتشار کربن محاسبه می‌شوند
- ضرایب انتشار کربن در `myems_system_db.tbl_energy_categories.kgco2e` ذخیره می‌شوند

**جدول‌های اصلی**:
- ساختار جدول با `myems_energy_db` یکسان است
- مقادیر داده‌ها در ضرب در ضریب انتشار کربن هستند، معمولاً در واحد kgCO2e (کیلوگرم معادل CO₂)

**نکات توسعه**:
- ضرایب انتشار کربن ممکن است با گذشت زمان تغییر کنند، بنابراین باید از ضرایب تاریخی پشتیبانی شود
- انواع انرژی مختلف (برق، گاز، نفت و غیره) دارای ضرایب انتشار متفاوتی هستند
- پشتیبانی از محاسبه انتشار کربن حوزه 1، حوزه 2 و حوزه 3

---

### 6. myems_energy_baseline_db (پایگاه داده خط پایه انرژی)

**هدف**: ذخیره داده‌های خط پایه انرژی برای تحلیل صرفه‌جویی در انرژی و ارزیابی بازده انرژی.

**ویژگی‌ها**:
- ساختار جدول مشابه `myems_energy_db` است
- داده‌های خط پایه معمولاً بر اساس داده‌های تاریخی یا مقادیر استاندارد محاسبه می‌شوند
- برای مقایسه مصرف واقعی انرژی با مصرف خط پایه و محاسبه صرفه‌جویی در انرژی استفاده می‌شود

**جدول‌های اصلی**:
- ساختار جدول با `myems_energy_db` یکسان است
- مقادیر خط پایه را ذخیره می‌کند نه مقادیر واقعی

**نکات توسعه**:
- داده‌های خط پایه نیاز به به‌روزرسانی منظم دارند
- پشتیبانی از روش‌های متعدد محاسبه خط پایه (میانگین تاریخی، تحلیل رگرسیون، مقادیر استاندارد و غیره)

---

### 7. Myems_energy_model_db (پایگاه داده مدل مصرف انرژی)

**هدف**: ذخیره داده‌های مدل مصرف انرژی 8760 ساعته سالانه (8760 ساعت در سال).

**ویژگی‌ها**:
- هر شیء 8760 رکورد (داده‌های ساعتی یک سال) ذخیره می‌کند
- برای پیش‌بینی و برنامه‌ریزی مصرف انرژی استفاده می‌شود
- نام جدول شامل پسوند `_8760` است

**جدول اصلی**:

|نام جدول|توضیحات|فیلد کلیدی|
|------|------|----------|
|`tbl_meter_8760`|مدل 8760 ساعته کنتور|`meter_id`, `start_datetime_utc`, `actual_value`|
|`tbl_equipment_input_category_8760`|مدل مصرف ورودی انرژی تجهیز|`equipment_id`, `energy_category_id`, `start_datetime_utc`, `actual_value`|
|`tbl_combined_equipment_input_category_8760`|مدل مصرف ورودی انرژی دستگاه ترکیبی|`combined_equipment_id`, `energy_category_id`, `start_datetime_utc`, `actual_value`|
|`tbl_space_input_category_8760`|مدل مصرف ورودی انرژی فضا|`space_id`, `energy_category_id`, `start_datetime_utc`, `actual_value`|
|`tbl_shopfloor_input_category_8760`|مدل مصرف ورودی انرژی کارگاه|`shopfloor_id`, `energy_category_id`, `start_datetime_utc`, `actual_value`|
|`tbl_store_input_category_8760`|مدل مصرف ورودی انرژی فروشگاه|`store_id`, `energy_category_id`, `start_datetime_utc`, `actual_value`|
|`tbl_tenant_input_category_8760`|مدل مصرف ورودی انرژی مستاجر|`tenant_id`, `energy_category_id`, `start_datetime_utc`, `actual_value`|

**نکات توسعه**:
- مدل 8760 ساعته معمولاً بر اساس داده‌های تاریخی یا مدل‌های استاندارد تولید می‌شود
- برای پیش‌بینی سالانه مصرف انرژی و تهیه بودجه استفاده می‌شود
- پشتیبانی از مشاهده بر اساس ابعاد مانند هفته، ماه، سه ماهه و غیره

---

### 8. myems_energy_plan_db (پایگاه داده برنامه انرژی)

**هدف**: ذخیره داده‌های برنامه و هدف انرژی.

**ویژگی‌ها**:
- ساختار جدول مشابه `myems_energy_db` است
- مقادیر برنامه‌ریزی شده را ذخیره می‌کند نه مقادیر واقعی
- برای بودجه‌بندی مصرف انرژی و مدیریت هدف استفاده می‌شود

**جدول‌های اصلی**:
- ساختار جدول با `myems_energy_db` یکسان است
- داده‌ها از فایل‌های برنامه یا ورود دستی می‌آیند

**نکات توسعه**:
- داده‌های برنامه نیاز به مقایسه با داده‌های واقعی برای تحلیل دارند
- پشتیبانی از برنامه‌های چند سطحی (سالانه، ماهانه، هفتگی و غیره)

---

### 9. myems_energy_prediction_db (پایگاه داده پیش‌بینی انرژی)

**هدف**: ذخیره داده‌های پیش‌بینی مصرف انرژی.

**ویژگی‌ها**:
- ساختار جدول مشابه `myems_energy_db` است
- مقادیر پیش‌بینی شده را ذخیره می‌کند نه مقادیر واقعی
- برای پیش‌بینی و هشدار مصرف انرژی استفاده می‌شود

**جدول‌های اصلی**:
- ساختار جدول با `myems_energy_db` یکسان است
- داده‌ها توسط الگوریتم‌های پیش‌بینی تولید می‌شوند

**نکات توسعه**:
- داده‌های پیش‌بینی نیاز به به‌روزرسانی منظم دارند
- پشتیبانی از الگوریتم‌های پیش‌بینی متعدد (سری زمانی، یادگیری ماشین و غیره)
- دقت پیش‌بینی نیاز به بهینه‌سازی مداوم دارد

---

### 10. Myems_fdd_db (پایگاه داده تشخیص عیب)

**هدف**: ذخیره داده‌های مرتبط با تشخیص و تشخیص عیب.

**ویژگی‌ها**:
- پشتیبانی از کانال‌های هشدار متعدد (وب، ایمیل، پیام کوتاه، وی‌چت، تلفن)
- موتور قاعده پشتیبانی از منطق تشخیص عیب پیچیده
- پشتیبانی از تایید و پردازش پیام‌های عیب

**ساختار اصلی جدول**:

|نام جدول|توضیحات|فیلد کلیدی|
|------|------|----------|
|`tbl_rules`|قوانین تشخیص|`id`, `name`, `category`, `fdd_code`, `priority`, `channel`, `expression` (JSON), `message_template`, `is_enabled`|
|`tbl_web_messages`|پیام وب|`id`, `rule_id`, `user_id`, `subject`, `category`, `priority`, `message`, `status`, `belong_to_object_type`, `belong_to_object_id`|
|`tbl_email_messages`|پیام ایمیل|`id`, `rule_id`, `recipient_name`, `recipient_email`, `subject`, `message`, `attachment_file_name`, `status`|
|`tbl_text_messages_outbox`|صندوق خروجی پیام کوتاه|`id`, `rule_id`, `recipient_mobile`, `message`, `status`, `acknowledge_code`|
|`tbl_text_messages_inbox`|صندوق ورودی پیام کوتاه|`id`, `sender_mobile`, `message`, `status`|
|`tbl_wechat_messages_outbox`|صندوق فرستنده پیام وی‌چت|`id`, `rule_id`, `recipient_openid`, `message_template_id`, `message_data` (JSON)|
|`tbl_wechat_messages_inbox`|صندوق ورودی پیام وی‌چت|`id`, `sender_openid`, `message`, `status`|
|`tbl_email_servers`|پیکربندی سرور ایمیل|`id`, `host`, `port`, `requires_authentication`, `user_name`, `password`, `from_addr`|
|`tbl_wechat_configs`|پیکربندی وی‌چت|`id`, `api_server`, `app_id`, `app_secret`, `access_token`, `expires_datetime_utc`|

**دسته‌های قاعده (category)**:
- `REALTIME`: هشدارهای بلادرنگ
- `SYSTEM`: هشدارهای سیستم
- `SPACE`: هشدارهای فضایی
- `METER`: هشدارهای کنتور
- `TENANT`: هشدارهای مستاجر
- `STORE`: هشدارهای فروشگاه
- `SHOPFLOOR`: هشدارهای کارگاه
- `EQUIPMENT`: هشدارهای تجهیزات
- `COMBINEDEQUIPMENT`: هشدارهای تجهیزات ترکیبی

**اولویت (priority)**:
- `CRITICAL`: بحرانی
- `HIGH`: بالا
- `MEDIUM`: متوسط
- `LOW`: پایین

**نکات توسعه**:
- فیلد `expression` عبارت قاعده را به فرمت JSON ذخیره می‌کند
- `message_template` از جایگزینی متغیر پشتیبانی می‌کند (مثلاً `$name`, `$value`)
- قوانین از اجرای برنامه‌ریزی شده و اجرای فوری پشتیبانی می‌کنند
- وضعیت پیام: `new``sent``acknowledged` / `timeout`

---

### 11. myems_user_db (پایگاه داده کاربر)

**هدف**: ذخیره احراز هویت کاربر، کلیدهای API، پیام‌های ایمیل و غیره.

**ویژگی‌ها**:
- حجم داده کم، اما الزامات امنیتی بالا دارد
- پشتیبانی از مدیریت مجوزهای کاربر
- پشتیبانی از احراز هویت کلید API

**ساختار اصلی جدول**:

|نام جدول|توضیحات|فیلد کلیدی|
|------|------|----------|
|`tbl_users`|اطلاعات کاربر|`id`, `name`, `uuid`, `display_name`, `email`, `salt`, `password`, `is_admin`, `is_read_only`, `privilege_id`, `account_expiration_datetime_utc`, `password_expiration_datetime_utc`, `failed_login_count`|
|`tbl_privileges`|پیکربندی مجوز|`id`, `name`, `data` (به فرمت JSON)|
|`tbl_sessions`|سیشن کاربر|`id`, `user_uuid`, `token`, `utc_expires`|
|`tbl_api_keys`|کلید API|`id`, `name`, `token`, `created_datetime_utc`, `expires_datetime_utc`|
|`tbl_email_messages`|پیام ایمیل|`id`, `recipient_name`, `recipient_email`, `subject`, `message`, `attachment_file_name`, `status`, `scheduled_datetime_utc`|
|`tbl_email_message_sessions`|مباحث ایمیل|`id`, `recipient_email`, `token`, `expires_datetime_utc`|
|`tbl_logs`|لاگ عملیات|`id`, `user_uuid`, `request_datetime_utc`, `request_method`, `resource_type`, `resource_id`, `request_body` (JSON)|
|`tbl_notifications`|پیام اعلان|`id`, `user_id`, `created_datetime_utc`, `status`, `subject`, `message`, `url`|
|`tbl_new_users`|کاربر جدید (در انتظار فعال‌سازی)|`id`, `name`, `uuid`, `display_name`, `email`, `salt`, `password`|
|`tbl_verification_codes`|کد تأیید|`id`, `recipient_email`, `verification_code`, `created_datetime_utc`, `expires_datetime_utc`|

**طراحی امنیتی**:
- رمزهای عبور با استفاده از نمک + هش ذخیره می‌شوند، ذخیره متن ساده وجود ندارد
- پشتیبانی از زمان انقضای حساب و رمز عبور
- پشتیبانی از محدودیت تلاش‌های ناموفق ورود
- کلیدهای API از زمان انقضای پشتیبانی می‌کنند

**نکات توسعه**:
- فیلدهای رمز عبور باید برای ذخیره رمزگذاری شوند، مستقیماً پرس و جوfficient نکنید
- توکن‌های сеشن باید به طور منظم پاک شوند تا رکوردهای منقضی شده حذف شوند
- لاگ‌های عملیات باید تمام اقدامات مهم را برای بازبینی ثبت کنند
- وضعیت‌های اعلان: `unread``read``archived`

---

### 12. myems_reporting_db (پایگاه داده گزارش‌دهی)

**هدف**: ذخیره پیام‌های ایمیل و ضمیمه‌های مرتبط با گزارش‌ها.

**ویژگی‌ها**:
- حجم داده کم
- پشتیبانی از ذخیره الگوهای گزارش و فایل‌های تولید شده

**ساختار اصلی جدول**:

|نام جدول|توضیحات|فیلد کلیدی|
|------|------|----------|
|`tbl_reports`|پیکربندی گزارش|`id`, `name`, `uuid`, `expression` (JSON), `is_enabled`, `last_run_datetime_utc`, `next_run_datetime_utc`, `is_run_immediately`|
|`tbl_reports_files`|سند گزارش|`id`, `uuid`, `create_datetime_utc`, `file_name`, `file_type` (xlsx/pdf/docx), `file_object` (LONGBLOB)|
|`tbl_template_files`|فایل الگو گزارش|`id`, `uuid`, `report_id`, `file_name`, `file_type`, `file_object`|
|`tbl_email_messages`|پیام ایمیل|`id`, `recipient_name`, `recipient_email`, `subject`, `message`, `attachment_file_name`, `attachment_file_object`, `status`|

**نکات توسعه**:
- فایل‌های گزارش از فرمت‌های اکسل، PDF و ورد پشتیبانی می‌کنند
- فایل‌های الگو برای تولید گزارش‌ها استفاده می‌شوند
- گزارش‌ها از تولید برنامه‌ریزی شده و فوری پشتیبانی می‌کنند
- فایل‌ها با استفاده از `LONGBLOB` ذخیره می‌شوند؛ به محدودیت‌های اندازه توجه کنید

---

### 13. myems_production_db (پایگاه داده تولید)

**هدف**: ذخیره داده‌های محصول مرتبط با تولید.

**ویژگی‌ها**:
- حجم داده کم
- برای تحلیل همبستگی مصرف انرژی تولید استفاده می‌شود

**ساختار اصلی جدول**:

|نام جدول|توضیحات|فیلد کلیدی|
|------|------|----------|
|`tbl_products`|اطلاعات محصول|`id`, `name`, `uuid`, `unit_of_measure`, `tag`, `standard_product_coefficient`|
|`tbl_teams`|اطلاعات تیم|`id`, `name`, `uuid`, `description`|
|`tbl_shifts`|اطلاعات شیفت|`id`, `shopfloor_id`, `team_id`, `product_id`, `product_count`, `start_datetime_utc`, `end_datetime_utc`, `reference_timestamp`|
|`tbl_shopfloor_hourly`|خروجی ساعتی کارگاه|`id`, `shopfloor_id`, `start_datetime_utc`, `product_id`, `product_count`|
|`tbl_space_hourly`|خروجی ساعتی فضا|`id`, `space_id`, `start_datetime_utc`, `product_id`, `product_count`|
|`tbl_shopfloors_products`|انجمن کارگاه و محصول|`id`, `shopfloor_id`, `product_id`|
|`tbl_shopfloors_teams`|انجمن کارگاه و تیم|`id`, `shopfloor_id`, `team_id`|

**نکات توسعه**:
- داده‌های تولید برای محاسبه مصرف انرژی واحد محصول استفاده می‌شوند
- پشتیبانی از آمار بر اساس ابعاد مانند محصول، تیم، کارگاه و غیره
- با داده‌های مصرف انرژی مرتبط برای محاسبه شاخص‌های بازده انرژی

---

## رابطه جریان داده

### فرآیند جمع‌آوری داده

### جریان جذب داده

دستگاه / سنسور ↓ (Modbus TCP / MQTT / HTTP) myems-modbus-tcp (سرویس جذب داده) ↓ (نوشتن) myems_historical_db.tbl_analog_value / tbl_digital_value / tbl_energy_value ↓ (نرمال سازی داده) myems-normalization (سرویس نرمال سازی) ↓ (پاکسازی داده) myems-cleaning (سرویس پاکسازی) ↓ (تجمیع داده) myems-aggregation (سرویس تجمیع) ↓ (نوشتن) myems_energy_db (داده انرژی) myems_billing_db (داده صورتحساب) myems_carbon_db (داده انتشار کربن)

---

### جریان پرس و جوfficient داده

درخواست کاربر ↓ myems-api (سرویس API) ↓ (پرس و جوfficient) myems_system_db (داده پیکربندی) myems_historical_db (داده تاریخی) myems_energy_db (داده انرژی) ↓ (پاسخ) myems-web / myems-admin (نمایش فرانت‌اند)

---

### نمودار رابطه داده

myems_system_db.tbl_points ↓ (point_id) myems_historical_db.tbl_analog_value ↓ (محاسبه تجمیع) myems_energy_db.tbl_meter_hourly ↓ (پیوند) myems_system_db.tbl_meters ↓ (پیوند) myems_system_db.tbl_equipments ↓ (پیوند) myems_system_db.tbl_spaces

---

## مشخصات طراحی ساختار جدول

### فیلدهای عمومی

تمام جداول شامل فیلدهای عمومی زیر هستند:

|نام فیلد|نوع|توضیحات|
|--------|------|------|
|`id`|BIGINT NOT NULL AUTO_INCREMENT|کلید اصلی، خودکار افزایش|
|`name`|VARCHAR(255)|نام|
|`uuid`|CHAR(36)|UUID، برای یکپارچه‌سازی سیستم‌های خارجی استفاده می‌شود|
|`description`|VARCHAR(255)|توضیحات (اختیاری)|

### فیلد زمان

|نام فیلد|نوع|توضیحات|
|--------|------|------|
|`utc_date_time`|DATETIME|زمان UTC (جدول داده‌های تاریخی)|
|`start_datetime_utc`|DATETIME|زمان شروع دوره زمانی (جدول داده‌های تجمیع‌شده)|
|`created_datetime_utc`|DATETIME|زمان ایجاد|
|`updated_datetime_utc`|DATETIME|زمان به‌روزرسانی|
|`last_run_datetime_utc`|DATETIME|آخرین زمان اجرا|
|`next_run_datetime_utc`|DATETIME|زمان اجرای بعدی|

**توجه**: تمام فیلدهای زمانی باید به طور یکپارچه از زمان UTC استفاده کنند و نمایش فرانت‌اند باید به زمان محلی تبدیل شود.

### فیلد عددی

|نام فیلد|نوع|توضیحات|
|--------|------|------|
|`actual_value`|DECIMAL(21, 6)|مقدار واقعی، پشتیبانی از دقت بالا (6 رقم اعشار)|
|`set_value`|DECIMAL(21, 6)|مقدار تنظیم شده|
|`rated_capacity`|DECIMAL(21, 6)|ظرفیت نامی|
|`rated_power`|DECIMAL(21, 6)|توان نامی|

### فیلدهای JSON

|نام فیلد|نوع|توضیحات|
|--------|------|------|
|`connection`|LONGTEXT|پیکربندی اتصال (فرمت JSON)|
|`expression`|LONGTEXT|عبارت (فرمت JSON)|
|`payload`|LONGTEXT|بار (فرمت JSON)|
|`data`|LONGTEXT|داده (فرمت JSON)|

**توجه**: فیلدهای JSON رشته‌های JSON فرمت‌بندی‌شده را ذخیره می‌کنند و قبل از استفاده نیاز به تجزیه و تحلیل دارند.

### فیلد وضعیت

|نام فیلد|نوع|توضیحات|
|--------|------|------|
|`is_enabled`|BOOL|فعال یا خیر|
|`is_active`|BOOL|وضعیت فعال‌سازی|
|`is_bad`|BOOL|آیا داده بد وجود دارد؟|
|`is_published`|BOOL|آیا منتشر شده است؟|
|`is_counted`|BOOL|آیا در آمار گنجانده شده است؟|
|`status`|VARCHAR(32)|وضعیت (مثلاً new, sent, done, error)|

### طراحی ایندکس

**ایندکس کلید اصلی**:
- تمام جداول دارای `PRIMARY KEY (id)` هستند

**ایندکس منحصر به فرد**:
- فیلدهای کلیدی (مانند `name`, `uuid`) معمولاً دارای ایندکس منحصر به فرد هستند

**ایندکس ترکیبی**:
- برای ترکیبات فیلدهای پرس و جوfficient مکرر، ایندکس ترکیبی ایجاد کنید
- برای مثال: `(point_id, utc_date_time)`, `(meter_id, start_datetime_utc)`

**ایندکس زمانی**:
- فیلد زمانی معمولاً به طور جداگانه ایندکس شده و از پرس و جوfficient محدوده زمانی پشتیبانی می‌کند