首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

公文轉發流程自定義的資料模型設計全解析

     編輯:關於SqlServer

企業級 MIS 系統的核心挑戰在於「流程多變、組織多元、權責動態」。本文提出一套高抽象度、可配置化的公文轉發流程資料模型,支援部門/職位導向、文件/表單雙軌、動作可擴展、跨節點跳轉、超時提醒升級等複雜業務場景。

核心需求分析

  1. 對崗不對人: 流程節點綁定「部門/職位」,人員異動不影響流程定義
  2. 雙軌制公文: 文件 (支援批次、部分退回) + 表單 (自定義欄位、同樣支援批次)
  3. 動作可配置: 核准、退回、轉辦、加簽、知會、駁回重擬... 新增動作無需改 Schema
  4. 節點動態: 節點數、發送/接收單位、處理模式 (單人/會簽/或簽)、最長等待時間皆可配置
  5. 智能催辦: 定期提醒、超時升級 (轉主管、記錄審計)、失敗處理
  6. 跨節點跳轉: 支援條件式跳過中間節點,建議透過「複製流程+修改」實現而非硬編碼跳轉邏輯

資料模型核心實體 (ER 圖文字版)

1. 組織架構體系 (樹狀結構)

Department (部門/單位)
- Dp_id (PK)
- Dp_name (UK)
- Dp_father (FK -> Department.Dp_id, 根節點設特殊值)
- Dp_layer (VARCHAR(6), 先序遍歷編碼如 001002003,加速子樹查詢)

Position (職位/角色)
- Ps_id (PK)
- Ps_name
- Dp_id (FK -> Department)  -- 所屬部門

User (使用者)
- Us_id (PK)
- Us_name
- Ps_id (FK -> Position)  -- 主職位
- ...其他屬性

2. 功能/權限體系

Function (功能/權限項目)
- f_id (PK)
- f_name (UK)
- f_desc

Role_Function (角色-功能映射,或 User_Group_Function)
- Role_id / Group_id
- f_id

3. 流程定義體系

Flow_Def (流程定義主檔)
- Fd_id (PK)
- Fd_name (UK)
- Fd_desc
- Fd_version
- Fd_status (啟用/停用/草稿)
- Created_by, Created_at

Flow_Node (流程節點)
- Fn_id (PK)
- Fd_id (FK -> Flow_Def)
- Fn_seq (節點順序)
- Fn_name
- Fn_type (啟動/審核/簽核/歸檔/條件判斷/子流程...)
- Fn_mode (單人/會簽/或簽/部門主管自動判定)
- Fn_timeout_min (最長等待分鐘數,0=不限)
- Fn_remind_interval_min (提醒間隔)
- Fn_escalation_rule (升級規則 JSON: 轉主管/發郵件/記審計)
- Fn_action_set_id (FK -> Action_Set 允許的動作集合)

Flow_Transition (節點轉移/路由)
- Ft_id (PK)
- Fd_id (FK)
- From_Fn_id (FK -> Flow_Node)
- To_Fn_id (FK -> Flow_Node)
- Ft_condition (路由條件運算式,支援欄位比較、函數、子查詢)
- Ft_priority (同起點多條件優先序)

4. 動作定義體系 (可擴展核心)

Action_Def (動作定義)
- Ad_id (PK)
- Ad_code (UK, 如 APPROVE, REJECT, TRANSFER, ADD_SIGN, CC)
- Ad_name
- Ad_handler_class (處理類別名稱,如 com.biz.flow.handler.ApproveHandler)
- Ad_icon, Ad_color (UI 顯示屬性)
- Ad_is_system (系統內建/自訂)

Action_Set (動作集合,節點綁定一組允許動作)
- As_id (PK)
- As_name

Action_Set_Detail
- As_id (FK)
- Ad_id (FK)
- Display_order

5. 表單/文件定義

Form_Def (表單定義)
- Fm_id (PK)
- Fm_name
- Fm_layout_json (欄位定義、驗證規則、UI 佈局 JSON)
- Fm_version

Document_Type (文件類型)
- Dt_id (PK)
- Dt_name
- Dt_category (公文/合約/報表...)

6. 執行實例體系 (運行時資料)

Flow_Inst (流程實例)
- Fi_id (PK)
- Fd_id (FK -> Flow_Def 版本快照)
- Fi_title
- Fi_initiator (Us_id)
- Fi_status (進行中/完成/終止/失效)
- Fi_created_at, Fi_finished_at
- Fi_current_node_id (FK -> Flow_Node)
- Fi_business_key (業務主鍵,如採購單號,便於關聯查詢)

Flow_Inst_Node (實例節點執行記錄)
- Fin_id (PK)
- Fi_id (FK)
- Fn_id (FK -> Flow_Node 定義快照)
- Fin_assignee_type (部門/職位/使用者/角色)
- Fin_assignee_id (實際受理者 ID,執行時解析填入)
- Fin_status (待處理/處理中/已核准/已退回/已跳過/超時)
- Fin_start_at, Fin_end_at
- Fin_action_taken (Ad_code)
- Fin_comment
- Fin_is_timed_out (是否超時)

Flow_Inst_Document (實例掛載公文)
- Fid_id (PK)
- Fi_id (FK)
- Dt_id (FK -> Document_Type)
- Fid_file_path / Fid_blob_id (檔案存儲引用)
- Fid_status (原始/已簽核/已退回/已替換)

Flow_Inst_Form_Data (實例表單資料)
- Ffd_id (PK)
- Fi_id (FK)
- Fm_id (FK -> Form_Def 版本快照)
- Ffd_data_json (表單填寫資料 JSON)
- Ffd_version

7. 通知/催辦/審計

Notification (通知/提醒記錄)
- Nt_id (PK)
- Fi_id, Fin_id (FK)
- Nt_type (提醒/超時升級/動作完成/失敗)
- Nt_channel (站內信/Email/SMS/Teams/Slack)
- Nt_recipient_id
- Nt_sent_at, Nt_read_at
- Nt_content_template_id

Audit_Log (審計日誌)
- Al_id (PK)
- Fi_id, Fin_id (FK)
- Al_operator (Us_id)
- Al_action (Ad_code)
- Al_before_state_json, Al_after_state_json
- Al_timestamp
- Al_ip, Al_user_agent

關鍵設計決策說明

決策點選擇理由
部門層級限定 3 層 + Dp_layer 編碼平衡查詢效能 (遞歸 CTE 替代) 與多數企業實況
動作擴展Action_Def + Handler Class 機制新增動作僅需註冊類別,零 Schema 變更,符合開放封閉原則
表單資料JSON 存儲 (PostgreSQL JSONB / SQL Server NVARCHAR(MAX) + 計算欄索引)支援任意欄位結構,避免 EAV 反模式效能陷阱
流程版本實例綁定定義快照 (Fd_id 含版本)歷史實例不受新版本影響,符合審計要求
跨節點跳轉建議「複製流程定義並修改」避免複雜路由條件導致不可維護,利用現有版本機制

效能優化建議

  • 關鍵 FK 加索引:Flow_Inst(Fi_status, Fi_current_node_id), Flow_Inst_Node(Fi_id, Fin_status)
  • 高頻查詢 (我的待辦、我發起的、部門統計) 建立物化視圖/快取表,排程刷新
  • 大量歷史實例分區表 (按 Fi_created_at 月份分區)
  • 檔案/Blob 存儲外移至物件存儲 (S3/MinIO/Azure Blob),資料庫僅存引用

結語

此模型以「高內聚、低耦合、可配置、可審計」為核心,前期投入較大 (表現層/業務邏輯層開發量大),但上線後 **極少需修改資料庫 Schema** 即可支撐業務持續演進。若專案不需極高靈活性,可簡化:合併文件/表單、固定動作集合、移除版本快照等。權衡點在於「現在多花力氣,未來少煩惱」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved