先決定你現在是要學,還是要在專案裡做
網站負責解釋與分發工作包;真正的 Repository 掃描、缺口判斷與文件產出交給 Coding Agent。
SDLC 實作課 · 交付物練習
先理解這份文件替你消除什麼不確定
把資料關係講清楚,避免半年後查不出真相
工程師憑直覺建表,半年後查歷史訂單發現 status 用 enum、誰改的、何時改的全沒紀錄。
資料模型是長期資產:API 可以改、UI 可以重做,但 data migration 成本永遠最高。
不先設計好 entity、關聯、constraint、retention,後面 migration 永遠在補洞。
誰負責、交給誰
主責: Architect(高層)/ DBA(物理層)/ Dev(實作)
協作: SA(補業務規則)、BE(API 對應)、SRE(補 retention 與 backup)
下游收件: BE 寫 ORM、DBA 寫 migration、QA 設計資料測試
何時值得做
必要時機: 新 entity 設計、跨系統整合、合規/稽核(有 PII / audit 需求)
不需要時: 純前端 / stateless service、單一 key-value cache
常見誤用: 只畫 entity 不畫 constraint / index / retention;Fowler 強調所有 DB 變更應為 migration 且與 code 共版控
- 01讀大綱
- 02看案例
- 03填素材
- 04貼提示詞
- 05對照驗收
Anatomy · 文件解剖
輕量版先回答 6 個核心章節
章節名稱可以因團隊調整,但每一段要求的判斷不能被省略。先讀問題,再看格式。
- 01
Executive Summary
範本必要章節
3-5 行說明本模型範圍、核心 entity、是否涉 PII
- 02
Entities
範本必要章節
每個 entity 必含 audit 欄位(created_at / updated_at / version / deleted_at)
- 03
Relationships
範本必要章節
把已確認的內容、判斷依據與仍待補充的資訊清楚分開。
- 06
Indexes(核心 query 覆蓋)
範本必要章節
列出覆蓋主要 query 的 index,至少 2-3 個
- 10
Decision Log
範本必要章節
每條必含 chosen + 至少 1 個 rejected option + 拒絕原因
- 12
Confidence & Sources & TODO
範本必要章節
把已確認的內容、判斷依據與仍待補充的資訊清楚分開。
Study · 對照學習
同一份交付物,先練核心,再看完整深度
輕量範本適合第一次練習與 MVP;完整範本保留跨職能交棒需要的細節。兩者都要求未知事項保持可見。
30 分鐘內先完成核心章節。
---
doc_type: "data-model"
variant: "light"
status: "draft"
owner: "<your-name>"
last_updated: "YYYY-MM-DD"
upstream:
required: ["srs", "business-rules"]
optional: ["existing-er"]
---
# Data Model: <bounded-context-name>
**Status:** Draft · **Owner:** <Architect/Dev> · **Last updated:** YYYY-MM-DD
> [!IMPORTANT]
> **AI 填寫規則:** 本範本 6 段(編號 1, 2, 3, 6, 10, 12),全部必填——刻意沿用完整版的章節編號讓兩版可對照。每結論行內加 `(依據:srs §XXX)`;每欄位帶 `[H]/[M]/[L]` confidence badge;缺資料寫 `_TODO: 需要 XXX_` 不編造欄位;**每個 entity 必含 audit 欄位(created_at / updated_at / version / deleted_at)**,不可省略;輕量版可省略合規 / 加密 / retention,但若涉 PII 必須升級到完整版。
---
## 1. Executive Summary
<!-- ai-fill: 3-5 行說明本模型範圍、核心 entity、是否涉 PII -->
<3-5 行說明>
> **TL;DR:** <一句話:N 個 entity,涵蓋哪個 BC>
---
## 2. Entities
<!-- ai-rule: 每個 entity 必含 audit 欄位(created_at / updated_at / version / deleted_at) -->
### Order · **[H]**
| Field | Type | Nullable | Constraints | Notes |
|---|---|---|---|---|
| `id` | uuid (v7) | [NO] | PK | |
| `customer_id` | uuid | [NO] | FK → Customer | |
| `status` | enum | [NO] | `PENDING/PAID/SHIPPED/CANCELLED` | state machine |
| `total_cents` | bigint | [NO] | check > 0 | 金額用整數存 |
| `created_at` | timestamptz | [NO] | audit, default `now()` | UTC |
| `updated_at` | timestamptz | [NO] | audit | trigger 更新 |
| `version` | int | [NO] | audit, optimistic lock | |
| `deleted_at` | timestamptz | [YES] | audit, soft delete | |
### Customer · **[H]**
...
---
## 3. Relationships
```mermaid
erDiagram
Customer ||--o{ Order : places
Order ||--|{ LineItem : contains
```
| From | To | Cardinality | FK | On delete | Confidence |
|---|---|---|---|---|---|
| Order | Customer | N:1 | `customer_id` | RESTRICT | **[H]** |
| LineItem | Order | N:1 | `order_id` | CASCADE | **[H]** |
---
## 6. Indexes(核心 query 覆蓋)
<!-- ai-rule: 列出覆蓋主要 query 的 index,至少 2-3 個 -->
| Entity | Index name | Type | Columns | Covers query |
|---|---|---|---|---|
| Order | `idx_order_customer_created` | B-tree | `(customer_id, created_at DESC)` | 用戶訂單列表(最新優先) |
| Order | `idx_order_status` | B-tree | `(status)` | 後台依狀態篩選 |
---
## 10. Decision Log
<!-- ai-rule: 每條必含 chosen + 至少 1 個 rejected option + 拒絕原因 -->
| Date | Decision | Options | Chosen | Rejected why | Confidence |
|---|---|---|---|---|---|
| YYYY-MM-DD | PK 策略 | auto-increment / uuid v4 / uuid v7 | uuid v7 | auto-increment (分散式發號難)、uuid v4 (B-tree fragmentation) | **[H]** |
---
## 12. Confidence & Sources & TODO
- **整份文件最低 confidence 欄位:** <列出所有 [L] 與 [M]>
- **Fabricated assumptions(推測但 input 未明說):**
- <假設 1:例:假設 soft delete(input 沒明說)>
- **Highest-value next input:** <下一份最該補的資料>
### TODO(缺資料)
- _TODO: 需要確認 Order.status 是否需保留歷史 transition log_
---
> [!CAUTION]
> **輸出前 AI 自檢:**
> - [ ] 6 段 H2 章節齊全(編號 1, 2, 3, 6, 10, 12,刻意不連號)
> - [ ] 每個 entity 含 audit 欄位(created_at / updated_at / version / deleted_at)
> - [ ] Relationships 段有 mermaid erDiagram
> - [ ] 每個 FK 標 on_delete 行為(RESTRICT / CASCADE / SET NULL)
> - [ ] Index 至少覆蓋 2 個主要 query pattern
> - [ ] 若涉 PII 欄位,**必須升級到完整版**(含加密 / retention / GDPR erasure)
> - [ ] Decision Log ≥ 1 條,每條有 rejected reason
> - [ ] 無 YAML / JSON schema 輸出(migration DDL 由 ORM 衍生)Practice · 換你試做
先用自己的話交代素材,不需要先學會工程術語
確定的就寫,不確定的留白。下一步要做的是請 Agent 找缺口,不是讓它替你猜一套合理答案。
可以先留白;複製提示詞後再到 Coding Agent 裡補充。
AI Practice · 手動三步
先問、再寫、最後審,不把整條流程鎖死
每一步都是獨立工作包。你可以停下補資料、修改限制或重做某一步,不需要服從固定的 Agent 接力流程。
只找阻擋文件成立的未知
先補會改變範圍、判斷或驗收結果的資訊,不急著寫文件。
我要製作「Data Model · 資料模型」。先不要產出文件。
請根據我的素材,找出會影響這份文件正確性或可執行性的未知事項,一次最多問 5 題。
每題請包含:
1. 問題
2. 為什麼現在必須知道
3. 它會影響哪個章節或決定
已經回答的事不要重問;可以延後的事標成「待決策」;不要替我猜答案。
本文件的核心章節:Executive Summary、Entities、Relationships、Indexes(核心 query 覆蓋)、Decision Log、Confidence & Sources & TODO複製後,請在標示位置貼上自己的素材。
Review · 自己驗收
文件存在,不代表下一個角色真的能使用
逐條檢查 Agent 的輸出。人類負責需求、限制與驗收,也必須能說明重要結論從哪裡來。
帶著這份文件,繼續到「Sequence Diagram · 時序圖」
下一張卡會接住新的決策問題;不用一次把整條 SDLC 全做完。
