🏛 企業應用架構模式
PoEAA
領域邏輯三選項 Transaction Script(程序式)/Domain Model(物件化)/Table Module
資料源二選一 Active Record(簡單)vs Data Mapper(乾淨但複雜)
分層 展現層/領域層/資料源層,各司其職
🎯 什麼情境該想到我
當你的業務邏輯「散落各處、service 層越來越肥、不知道邏輯該放哪」時。
⚙️ 怎麼用(依業務複雜度選)
- Transaction Script(交易腳本):一個動作=一段程序式流程。簡單業務用它最直接,別過度設計。
- Domain Model(領域模型):把業務邏輯放進有行為的領域物件(充血模型),而非只有 getter/setter 的貧血物件 + 肥 service。複雜、多變的業務用它才管得住(呼應 領域驅動設計)。
- Table Module:以「一張表對應一個類別」組織邏輯,介於兩者之間。
判斷:業務越複雜、規則越多變 → 越該用 Domain Model;越簡單 → 越該用 Transaction Script。 別為簡單 CRUD 硬套領域模型。
🧪 我實際套用的紀錄
- 2026-07-15:(待填)
⚠️ 注意
- 「貧血模型 + 肥 service」在複雜業務下會失控;但簡單 CRUD 硬做充血模型也是過度工程。按複雜度選。
🔗 相關工具
- 工具-物件關聯映射模式 —— 配套決策,選了領域模型就得配較重的 ORM,選了交易腳本用閘道就夠
- 工具-實體值物件與聚合 —— DDD 版的細化,走領域模型路線時用它決定物件怎麼切
- 工具-管理複雜度 —— 選型準則,業務複雜度不高時硬上領域模型只是徒增複雜
🎯 什麼情境該想到我
當你要設計「物件如何對應到資料庫」,或在不同 ORM 風格間抉擇、遇到 ORM 效能問題時。
⚙️ 怎麼用(認識底層模式)
- Active Record:物件自己包含資料庫存取邏輯(
user.save())。簡單、快速,適合邏輯不複雜的 CRUD(Rails、Eloquent)。 - Data Mapper:物件與資料庫完全分離,由 Mapper 負責搬運。乾淨、可測、領域物件不依賴 DB,適合複雜領域(Hibernate、Prisma、TypeORM 的 mapper 風格)。
- Unit of Work:一次交易內追蹤所有變更,最後統一提交/回滾 → 減少 DB 往返、保證一致。
- Identity Map:同一物件一次請求只載入一次,避免重複查詢與不一致。
🧪 我實際套用的紀錄
- 2026-07-15:(待填)
⚠️ 注意
- ORM 隱藏了 SQL,容易踩 N+1 查詢與意外的大量載入;效能敏感處要看實際 SQL(呼應 工具-交易與隔離等級)。
🔗 相關工具
- 工具-領域邏輯組織模式 —— 姊妹題,先決定業務邏輯放哪,才知道該配哪種 ORM 風格
- 工具-資料結構的選擇 —— 效能面的延伸,ORM 慢常常是取回來之後用錯結構造成的
- 工具-交易與隔離等級 —— ORM 藏起來但你逃不掉的東西,工作單元與併發控制最終還是交易問題
① 領域邏輯 Domain Logic
- [[交易指令稿|交易指令稿 Transaction Script]]
- [[領域模型|領域模型 Domain Model]]
- [[表格模組|表格模組 Table Module]]
- [[服務層|服務層 Service Layer]]
② 資料源架構 Data Source Architectural
- [[表格資料閘道|表格資料閘道 Table Data Gateway]]
- [[列資料閘道|列資料閘道 Row Data Gateway]]
- [[主動記錄|主動記錄 Active Record]]
- [[資料對應器|資料對應器 Data Mapper]]
③ 物件關聯行為 O-R Behavioral
- [[工作單元|工作單元 Unit of Work]]
- [[識別對應|識別對應 Identity Map]]
- [[延遲載入|延遲載入 Lazy Load]]
④ 物件關聯結構 O-R Structural
- [[識別欄位|識別欄位 Identity Field]]
- [[外鍵對應|外鍵對應 Foreign Key Mapping]]
- [[關聯表對應|關聯表對應 Association Table Mapping]]
- [[從屬對應|從屬對應 Dependent Mapping]]
- [[內嵌值|內嵌值 Embedded Value]]
- [[序列化大物件|序列化大物件 Serialized LOB]]
- [[單表繼承|單表繼承 Single Table Inheritance]]
- [[類別表繼承|類別表繼承 Class Table Inheritance]]
- [[具象表繼承|具象表繼承 Concrete Table Inheritance]]
- [[繼承對應器|繼承對應器 Inheritance Mappers]]
⑤ 物件關聯中繼資料 O-R Metadata
- [[中繼資料對應|中繼資料對應 Metadata Mapping]]
- [[查詢物件|查詢物件 Query Object]]
- [[儲存庫|儲存庫 Repository]]
⑥ Web 表現層 Web Presentation
- [[模型-視圖-控制器|模型-視圖-控制器 Model View Controller]]
- [[頁面控制器|頁面控制器 Page Controller]]
- [[前端控制器|前端控制器 Front Controller]]
- [[樣板視圖|樣板視圖 Template View]]
- [[轉換視圖|轉換視圖 Transform View]]
- [[兩步驟視圖|兩步驟視圖 Two Step View]]
- [[應用控制器|應用控制器 Application Controller]]
⑦ 分散式 Distribution
- [[遠端外觀|遠端外觀 Remote Facade]]
- [[資料傳輸物件|資料傳輸物件 Data Transfer Object]]
⑧ 離線並發 Offline Concurrency
- [[樂觀離線鎖|樂觀離線鎖 Optimistic Offline Lock]]
- [[悲觀離線鎖|悲觀離線鎖 Pessimistic Offline Lock]]
- [[粗粒度鎖|粗粒度鎖 Coarse-Grained Lock]]
- [[隱含鎖|隱含鎖 Implicit Lock]]
⑨ 會話狀態 Session State
- [[用戶端會話狀態|用戶端會話狀態 Client Session State]]
- [[伺服器會話狀態|伺服器會話狀態 Server Session State]]
- [[資料庫會話狀態|資料庫會話狀態 Database Session State]]
⑩ 基礎模式 Base Patterns
- [[閘道|閘道 Gateway]]
- [[對應器|對應器 Mapper]]
- [[層超型|層超型 Layer Supertype]]
- [[分離介面|分離介面 Separated Interface]]
- [[登錄器|登錄器 Registry]]
- [[值物件|值物件 Value Object]]
- [[金錢|金錢 Money]]
- [[特例|特例 Special Case]]
- [[外掛|外掛 Plugin]]
- [[服務樁|服務樁 Service Stub]]
- [[記錄集|記錄集 Record Set]]