數據流圖(DFD)在系統分析與設計中扮演著關鍵藍圖的角色。它們以視覺化方式呈現資訊在系統中流動的方式,專注於資料的流動,而非控制邏輯。無論您是設計新的企業資源規劃系統,還是分析現有的遺留應用程式,理解資料的移動都是確保清晰與效率的關鍵。本指南探討了建立有效 DFD 的機制、規則與最佳實務,且不依賴特定商業工具。

什麼是數據流圖?🤔
數據流圖是一種結構化分析技術,用於視覺化系統內資料的流動。它將複雜的系統分解為較小且可管理的部分,顯示資料如何被輸入、處理、儲存與輸出。與可能著重於時間序列或決策邏輯的其他圖表不同,DFD 嚮嚴格追蹤資料實體及其轉換。
這些圖表在軟體開發生命週期中具有多項關鍵用途:
- 溝通: 它們透過提供一種視覺化語言,彌補技術團隊與利害關係人之間的差距。
- 缺口分析: 它們有助於在需求收集階段識別遺漏的流程或資料路徑。
- 文件記錄: 它們可作為未來維護與故障排除的參考。
- 優化: 它們能揭露資料累積或移動效率低下的瓶頸。
DFD 是層級式的。複雜系統很少以單一視圖呈現,而是被分解為多個細節層級,讓分析人員能依需求聚焦於特定區域。
四個核心組件 🧩
要構建有效的數據流圖,您必須理解四個基本構建模塊。DFD 中的每個元素都屬於這四類之一。
| 組件 | 符號說明 | 功能 | 範例 |
|---|---|---|---|
| 外部實體 | 矩形或方形 | 系統邊界外的資料來源或目的地。 | 客戶、管理員、第三方 API |
| 處理 | 圓形或圓角矩形 | 將輸入資料轉換為輸出資料。 | 計算稅額、驗證使用者、產生報表 |
| 資料儲存 | 開口矩形或平行線 | 資料儲存以供後續檢索。 | 資料庫、檔案系統、電子郵件收件匣 |
| 資料流 | 箭頭 | 資料在元件之間移動的路徑。 | 訂單詳情、登入憑證、發票 |
1. 外部實體 🧑💼
也稱為終結者,這些代表與您的系統互動但位於其控制範圍之外的人、組織或其他系統。它們是資料流的起點或終點。明確界定系統邊界至關重要,以判斷何者為外部實體,何者為內部流程。
2. 流程 ⚙️
流程是工作發生的主動元件。它接收資料,轉換資料,並送出資料。流程必須始終至少有一個輸入和一個輸出。如果流程有輸入但無輸出,則稱為「黑洞」;若只有輸出而無輸入,則稱為「奇蹟」。兩者皆為邏輯錯誤。
3. 資料儲存 🗃️
資料儲存代表被動的儲存庫,資訊在其中靜止。它們不處理資料,僅用來存放資料。這可能是實體資料庫、紙本檔案櫃,或雲端儲存桶。在資料流程圖中,資料流入儲存庫以備儲存,並流出以供檢索。
4. 資料流 ➡️
資料流是連接元件。它們代表資訊的移動。每一個資料流都必須以名詞片語標示所移動的內容(例如:「付款資訊」),而非動詞(例如:「發送付款」)。資料流不能在沒有流程或儲存庫介於中間的情況下跨越系統邊界。
資料流程圖層級說明 📈
資料流程圖以層級結構組織。這讓您可以透過將系統分解為抽象層次來管理複雜性。
第0層:上下文圖
上下文圖是最高層級的視圖。它將整個系統呈現為一個單一的流程泡泡。它識別所有外部實體以及進入和離開系統的主要資料流。此圖回答的問題是:「系統做什麼?」並明確建立系統邊界。
第1層:主要流程
第1層將上下文圖中的單一流程擴展為其主要的子流程。此層揭示系統的主要功能區域。例如,一個「銷售系統」可能分解為「訂單處理」、「庫存管理」和「計費」。資料儲存也在此層引入。
第2層:詳細流程
第2層深入探討第1層中的特定流程。這是在此層面繪製細節步驟的地方。例如,第1層的「計費」流程可能進一步分解為「計算費用」、「套用折扣」和「產生發票」。此層通常最為詳細,並用於實作指引。
符號風格 📐
繪製資料流程圖時使用兩種主要符號風格。兩者傳達相同的邏輯資訊,但使用不同的形狀。
- Yourdon 與 DeMarco 符號風格:流程使用圓形,資料儲存使用開口矩形。此風格常與較舊的方法論相關,但仍廣受認可。
- Gane 與 Sarson 符號風格:流程使用圓角矩形,資料儲存使用平行的水平線。此風格因清晰度高,常被現代系統設計所青睞。
繪製圖表時,一致性至關重要。選擇一種符號風格並貫徹於整個文件集,以避免利益相關者產生混淆。
基本規則與限制 ⚖️
為了確保您的資料流程圖的完整性,您必須遵守特定規則。違反這些規則會使圖表在邏輯上無效。
- 資料平衡: 每個流程必須至少有一個輸入流和一個輸出流。資料不能憑空產生,也不能無跡可循地被消滅。
- 無直接的實體至儲存體流動: 資料不能直接從外部實體流動到資料儲存體。它必須先經過一個流程。這確保所有資料在儲存前都經過驗證或轉換。
- 無直接的儲存體至儲存體流動: 資料不能直接從一個儲存體移動到另一個儲存體。必須由一個流程來中介轉移,以確保資料完整性。
- 命名一致性: 資料流必須具有唯一且描述性的名稱。如果相同的資料在多個地方流動,應使用相同的名稱以維持可追蹤性。
- 分解: 在將一個流程分解為較低層級時,輸入和輸出必須與父流程相符。這稱為「平衡」。
應避免的常見陷阱 ⚠️
即使經驗豐富的分析師在建模資料流時也可能犯錯。了解常見錯誤有助於維持圖表品質。
1. 黑洞
黑洞是一種接收資料但不產生任何輸出的流程。這意味著資料進入系統後消失且無任何結果。在有效的資料流程圖中,這是不可能的。進入流程的每一筆資料都必須導致某種變更或輸出。
2. 灰洞
灰洞是一種輸入資料與輸出資料在邏輯上不相符的流程。例如,若輸入為「客戶姓名」,但輸出為「寄送地址」,則缺少一個轉換流程。必須考慮產生輸出所需的資料。
3. 流動過多
將過多資料流動過載於單一流程會使圖表難以閱讀。若一個流程的輸入或輸出超過七個,很可能其功能過於複雜,應分解為較小的子流程。
4. 控制流混淆
資料流程圖不顯示控制流、時間序列或迴圈。不要使用箭頭表示「從這裡開始」或「然後執行此操作」。所有箭頭都代表資料移動。若需顯示邏輯或時間,應使用流程圖。
資料流程圖與流程圖之比較 🔄
人們常將資料流程圖與流程圖混淆。雖然兩者都使用箭頭和形狀,但其用途不同。
| 特徵 | 資料流程圖(DFD) | 流程圖 |
|---|---|---|
| 重點 | 資料移動與儲存。 | 控制流與決策邏輯。 |
| 流程 | 轉換資料。 | 執行步驟或決策。 |
| 時間 | 不顯示順序。 | 顯示操作順序。 |
| 決策點 | 未使用。 | 大量使用(菱形形狀)。 |
| 最適合 | 系統分析與需求。 | 演算法設計與程式邏輯。 |
逐步創建流程 🛠️
建立資料流程圖需要有結構化的方法。遵循以下步驟以建立穩健的模型。
- 識別系統邊界: 定義系統內部與外部的內容。這將決定您的外部實體。
- 繪製上下文圖: 將系統作為一個流程置於中心。繪製箭頭指向所有外部實體,以顯示高階的資料流動。
- 識別主要流程: 將中心流程分解為第1級流程。這些是系統的主要功能。
- 新增資料儲存: 判斷資料在流程之間需要儲存的位置。將其與相關流程連接。
- 優化資料流: 在流程、儲存與實體之間繪製箭頭。確保所有標籤都是明確的名詞。
- 檢查平衡性: 確認第1級流程的輸入與輸出與上下文圖相符。
- 進一步分解: 如果第1級流程過於複雜,則建立第2級圖以詳細說明其內部運作。
對系統架構的優勢 🏗️
實施資料流程圖為系統架構與開發團隊帶來具體優勢。
- 清晰度: 視覺模型能減少需求中的模糊性。利益相關者可以清楚看到他們正在傳送和接收的資料。
- 可擴展性: 層次圖表讓架構師能在不讓團隊被細節淹沒的情況下擴展系統設計。
- 整合: 資料流程圖能更容易識別不同子系統之間的互動方式,這對於微服務或分散式系統至關重要。
- 安全性: 透過繪製資料流程,安全團隊可以識別敏感資料的流向,並在適當的節點應用加密或存取控制。
維護與迭代 🔁
資料流程圖不是一次性產物。系統會演進,資料需求也會改變。保持圖表的更新至關重要。
- 版本控制: 將圖表視為程式碼。使用版本控制來追蹤隨時間的變更。
- 變更管理: 當新增需求時,立即更新資料流程圖以反映新的資料路徑。
- 審查週期: 計畫定期與利益相關者進行審查,以確保圖表仍符合業務現實。
- 停用: 當移除某個流程時,確保所有相關的資料流程也一併移除,以避免出現孤立的資料參考。
清晰度的最佳實務 ✨
為確保您的資料流程圖有效,請遵循以下指引。
- 使用描述性標籤: 使用動詞加名詞來命名流程(例如:「處理訂單」)。使用名詞來命名資料流程(例如:「訂單詳情」)。
- 避免線條交叉: 調整元件以減少箭頭交叉。若必須交叉,請使用「跳躍」符號或重新調整佈局。
- 保持簡單: 每個流程最多包含七個項目。若超過此數量,應將流程拆分。
- 保持一致的方向: 維持外部實體位於左右兩側,資料儲存位於上下方,以保持一致性。
- 與使用者共同審查: 將圖表展示給系統的實際使用者。他們通常能發現技術分析師容易忽略的缺失資料流程。
最終考量 🔍
資料流程圖仍然是結構化分析的基石。它提供了一種中立的方式來討論系統需求,而不會陷入技術實現細節的泥潭。通過專注於資料的流動,團隊可以在設計階段早期識別出效率低下和邏輯漏洞。
請記住,圖表是一種思考工具,而不僅僅是文檔。繪製流程的過程常常能揭示出原本隱藏在文字描述中的問題。無論你是在敏捷環境中工作,還是採用傳統的瀑布模型,系統性地繪製資料流程都能確保系統架構的穩健與可維護性。
透過遵守規則、避免常見陷阱,並隨著系統的演進持續維護圖表,你就能確保文檔在軟體整個生命周期中始終是可靠的真相來源。











