MySQL schema Class 初稿
本文件用於整理 MySQL TaskStore PoC 第一版的 C# schema class 初稿。目標是讓 MySQL 欄位型別、索引與描述可以先在 C# Class 中維護,再由 Schema Generator 產生 MySQL 5.6.2 相容 DDL。
本文件仍屬設計初稿,不代表已經同意修改程式 repo、安裝套件、建立資料表、變更 public method 或改變專案啟動方式。
設計原則
- 第一版只保存任務執行歷程,不保存完整設備主檔、案場資料、權限或報表。
- Core 不依賴資料庫 class;schema class 應放在 Infrastructure / DB 相關模組。
- MySQL 5.6.2 不使用
JSON欄位,原始資料以TEXT或LONGTEXT保存。 - MySQL 5.6.2 不使用小數秒時間欄位,耗時以
TimeTakenMs另外保存。 - 第一版不使用外鍵約束,先以識別碼建立邏輯關聯與索引。
共用型別規則
| 語意 | MySQL 型別 | C# 型別 | 說明 |
|---|---|---|---|
| 識別碼 | varchar(64) | string | TaskId、NodeId、DeviceId 等 |
| 名稱 | varchar(128) | string | WorkflowName、NodeName、DeviceName |
| 狀態 | varchar(32) | string | running、completed、failed 等 |
| 錯誤碼 | varchar(64) | string | 標準 ErrorCode |
| 原始資料 | longtext | string | RawRequest、RawResponse、AdapterData、StackTrace |
| 時間 | datetime | DateTime? | 不使用小數秒 |
第一版資料表總覽
| C# Class | Table | 用途 |
|---|---|---|
TaskExecutionRecord | task_executions | 任務層級狀態與摘要 |
NodeExecutionRecord | node_executions | 節點執行歷程 |
CommandExecutionRecord | command_executions | Adapter / Device command 執行結果 |
TaskErrorRecord | task_errors | 錯誤快照與例外資訊 |
TaskExecutionRecord
用途:保存一次 Workflow / Task 執行的總體狀態。建議 Table:task_executions。
[DbTable("task_executions", Description = "任務執行紀錄")]
[DbIndex("idx_task_workflow", "workflow_id")]
[DbIndex("idx_task_status", "status")]
[DbIndex("idx_task_started_at", "started_at")]
[DbIndex("idx_task_error_code", "error_code")]
public class TaskExecutionRecord
{
[DbColumn("task_id", "varchar(64)", IsPrimaryKey = true, IsRequired = true, Description = "任務識別碼")]
public string TaskId { get; set; }
[DbColumn("workflow_id", "varchar(64)", IsRequired = true, Description = "Workflow 識別碼")]
public string WorkflowId { get; set; }
[DbColumn("status", "varchar(32)", IsRequired = true, Description = "任務狀態")]
public string Status { get; set; }
}
完整建議欄位包含 TaskId、WorkflowId、WorkflowName、WorkflowVersion、Status、StartNodeId、CurrentNodeId、StartedAt、EndedAt、TimeTakenMs、ResultCode、ResultMessage、ErrorCode、OperatorName、HostName、AppVersion、CreatedAt、UpdatedAt。
NodeExecutionRecord
用途:保存每個 Workflow Node 的執行結果、重試與錯誤摘要。建議 Table:node_executions。
| Property | Column | MySQL 型別 | 必填 | 描述 |
|---|---|---|---|---|
NodeExecutionId | node_execution_id | varchar(64) | 是,PK | 節點執行紀錄識別碼 |
TaskId | task_id | varchar(64) | 是 | 所屬任務識別碼 |
NodeId | node_id | varchar(64) | 是 | Workflow Node 識別碼 |
Status | status | varchar(32) | 是 | 節點狀態 |
DeviceId | device_id | varchar(64) | 否 | 節點使用設備 |
CommandName | command_name | varchar(64) | 否 | 節點執行命令 |
StartedAt | started_at | datetime | 否 | 開始時間 |
ErrorCode | error_code | varchar(64) | 否 | 節點錯誤代碼 |
CommandExecutionRecord
用途:保存 Adapter / Device command 的實際執行紀錄,包含 RawRequest、RawResponse 與 AdapterData。建議 Table:command_executions。
| Property | Column | MySQL 型別 | 必填 | 描述 |
|---|---|---|---|---|
CommandExecutionId | command_execution_id | varchar(64) | 是,PK | 命令執行紀錄識別碼 |
TaskId | task_id | varchar(64) | 是 | 所屬任務識別碼 |
DeviceId | device_id | varchar(64) | 是 | 設備識別碼 |
ConnectionType | connection_type | varchar(32) | 否 | TCP、UDP、Serial、ModbusTcp 等 |
CommandName | command_name | varchar(64) | 是 | 命令名稱 |
Status | status | varchar(32) | 是 | 命令狀態 |
RawRequest | raw_request | longtext | 否 | 原始請求內容 |
RawResponse | raw_response | longtext | 否 | 原始回應內容 |
AdapterData | adapter_data | longtext | 否 | Adapter 附加資料 |
TaskErrorRecord
用途:保存錯誤快照,讓任務、節點、命令錯誤可被獨立查詢。建議 Table:task_errors。
| Property | Column | MySQL 型別 | 必填 | 描述 |
|---|---|---|---|---|
ErrorRecordId | error_record_id | varchar(64) | 是,PK | 錯誤紀錄識別碼 |
TaskId | task_id | varchar(64) | 是 | 所屬任務識別碼 |
ErrorCode | error_code | varchar(64) | 是 | 標準錯誤代碼 |
ErrorMessage | error_message | text | 否 | 錯誤訊息 |
ExceptionType | exception_type | varchar(128) | 否 | Exception 型別 |
StackTrace | stack_trace | longtext | 否 | Stack trace |
SourceLayer | source_layer | varchar(64) | 否 | Core、Adapter、Infrastructure、Host |
OccurredAt | occurred_at | datetime | 是 | 錯誤發生時間 |
不建議第一版納入的欄位
| 欄位 | 延後原因 |
|---|---|
site_id | 多案場尚未進入第二階段第一個 PoC |
tenant_id | 權限與租戶模型尚未定義 |
user_id | 使用者系統尚未導入 |
device_group_id | 設備主檔與群組管理尚未定義 |
json 型態欄位 | MySQL 5.6.2 不適合使用 |
待確認問題
CreatedAt/StartedAt/EndedAt是否統一由程式端寫入。- 時間是否統一保存 UTC,顯示時再轉本地時間。
- 第一版是否允許
RawRequest/RawResponse保存完整內容。 AdapterData是否需限制大小或只保存摘要。- 第一版是否先不建立外鍵,只保留索引與邏輯關聯。
建議下一步
MySQL 行前連線資訊確認請參考:MySQL 行前連線資訊確認。
建議下一步做「MySQL 行前連線資訊確認」,先確認測試 database、Host、Port、User、Password 提供方式與權限。
資訊齊全後再進入「Schema Attribute 實作前確認」與程式 repo 實作。