《SQL反模式》是2011年人民郵電出版社出版的圖書,作者是Bill Karwin。
基本介紹
- 中文名:SQL反模式
- 出版社:人民郵電出版社
- ISBN:978-7-115-26127-4
- 日期:2011-9
- 作者:Bill Karwin
內容簡介,圖書目錄,
內容簡介
《SQL反模式》是一本廣受好評的SQL圖書。它介紹了如何避免在SQL的使用和開發中陷入一些常見卻經常被忽略的誤區。它通過講述各種具體的案例,以及開發人員和使用人員在面對這些案例時經常採用的錯誤解決方案,來介紹如何識別、利用這些陷阱,以及面對問題時正確的解決手段。另外,《SQL反模式》還涉及了SQL的各級範式和針對它們的正確理解。
圖書目錄
第1章 引言 1
1.1 誰需要這本書 2
1.2 本書內容 2
1.2.1 本書結構 3
1.2.2 反模式分解 4
1.3 本書未涉及的內容 4
1.4 規約 5
1.5 範例資料庫 6
1.6 致謝 8
第一部分 邏輯型資料庫設計反模式
第2章 亂穿馬路 10
2.1 目標:存儲多值屬性 11
2.2 反模式:格式化的逗號分隔列表 11
2.2.1 查詢指定賬號的產品 11
2.2.2 查詢指定產品的賬號 12
2.2.3 執行聚合查詢 12
2.2.4 更新指定產品的賬號 12
2.2.5 驗證產品ID 懂永樂13
2.2.6 選擇合適的分隔設定 13
2.2.7 列表長度限制 13
2.3 如何識別反模式 14
2.4 合理使用反故連詢模式 14
2.5 解決方案:創建一張交叉表 14
2.5.1 通過賬號查詢產品和反過來查詢 15
2.5.2 執行聚合查詢 16
2.5.3 更新指定產品的相關聯繫人 16
2.5.4 驗證產品ID 16
2.5.5 選擇分隔設定 17
2.5.6 列表長度限制 17
2.5.7 其他使用交叉表的好處 17
第3章 單純的樹 18
3.1 目標:分層存儲與查詢 18
3.2 反模式:總是依賴父節點 19
3.2.1 使用鄰接表查詢樹 20
3.2.2 使用鄰接表維護樹 21
3.3 如何識別反模式 22
3.4 合理使用反模式 23
3.5 解決方案:使用其他樹模型 24
3.5.1 路徑枚舉 24
3.5.2 嵌套集 26
3.5.3 閉包表 29
3.5.4 你該使用哪種設計 33
第4章 需要ID 34
4.1 目標:建立主鍵規範 35
4.2 反模式:以不變應萬變 36
4.2.1 冗餘鍵值 36
4.2.2 允許重複項 37
4.2.3 意義不明的關鍵字 38
4.2.4 使用USING關鍵字 38
4.2.5 使用組合鍵之難 39
4.3 如何識別反模式 39
4.4 合理使用反模式 40
4.5 解決方案:裁剪設計 40
4.5.1 直截了當地描述設計 40
4.5.2 打破傳統 41
4.5.3 擁抱自然鍵和組合鍵 41
第5章 不用鑰匙的入口 43
5.1 目標:簡化資料庫架構 43
5.2 反模式:無視約束 44
5.2.1 假設無瑕代碼 44
5.2.2 檢查錯誤 45
5.2.3 “那不是我的錯!” 45
5.2.4 進退維谷 46
5.3 如何識別反模式 46
5.4 合理使用反模式 47
5.5 解決方案:聲明約束 47
5.5.1 支持同步修改 48
5.5.2 系統開銷過度?不見得 48
第6章 實體-屬性-值 50
6.1 目標:支持可變的屬性 50
6.2.1 查詢屬性 53
6.2.2 支持數據完整性 53
6.2.3 無法聲明強制屬性 53
6.2.4 無法使用SQL的數據類型謎記照 53
6.2.5 無法確保引用完整性 54
6.2.6 無法配置屬精重凝影性名 55
6.2.7 重組列 55
6.3 如何識別反模式 56
6.4 合理使用反模式 56
6.5 解決方案:模型化子類型 57
6.5.1 單表繼承 燥鴉陵57
6.5.2 實體表繼承 58
6.5.3 類表繼承 60
6.5.4 半結構化數據模型 61
6.5.5 後處理 61
第7章 多態關聯 64
7.1 目標:引用多個父表 65
7.2.1 定義多態關聯 65
7.2.2 使用多態關聯進行查詢 66
7.2.3 非面向對象範例 67
7.3 如何識別反模式 68
7.4 合理使用反模式 69
7.5 解決方案:讓關係變得簡單 69
7.5.1 反向引用 69
7.5.2 創建交叉表 69
7.5.3 設立交通燈 70
7.5.4 雙向查找 71
7.5.5 合併跑道 71
7.5.6 創建共用的超級表 72
第8章 多列屬性 75
8.1 目標:存儲多值屬性 75
8.2 反模式:創建多個列 76
8.2.1 查詢數據 76
8.2.2 添加及刪除值 77
8.2.3 確保唯一性 78
8.2.4 處理不斷增長的值集 78
8.3 如何識別反模式 79
8.4 合理使用反設汗模式 79
8.5 解決方案:創建從屬表 80
第9章 元數據分裂 82
9.1 才套碑晚目標:支持可擴展性 83
9.2 反模式:克隆表與克隆列 83
9.2.1 不斷產生的新表 84
9.2.2 管理數據完整性 84
9.2.3 同步數據 85
9.2.4 確保唯一性 85
9.2.5 跨表查詢 86
9.2.6 同步元數據 86
9.2.7 管理引用完整性 86
9.2.8 標識元數據分裂列 87
9.3 如何識別反模式 87
9.4 合理使用反模式 88
9.5 解決方案:分區及標準化 89
9.5.1 使用水平分區 89
9.5.2 使用垂直分區 89
9.5.3 解決元數據分裂列 91
第二部分 物理資料庫設計反模式
第10章 取整錯誤 94
10.1 目標:使用小數取代整數 94
10.2 反模式:使用FLOAT類型 95
10.2.1 捨入的必要性 95
10.2.2 在SQL中使用FLOAT 96
10.3 如何識別反模式 98
10.4 合理使用反模式 98
10.5 解決方案:使用NUMERIC類型 98
第11章 每日新花樣 100
11.1 目標:限定列的有效值 100
11.2 反模式:在列定義上指定可選值 101
11.2.1 中間的是哪個 102
11.2.2 添加新口味 103
11.2.3 老的口味永不消失 103
11.2.4 可移植性低下 103
11.3 如何識別反模式 104
11.4 合理使用反模式 104
11.5 解決方案:在數據中指定值 104
11.5.1 查詢候選值集合 105
11.5.2 更新檢查表中的值 105
11.5.3 支持廢棄數據 105
11.5.4 良好的可移植性 106
第12章 幽靈檔案 107
12.1 目標:存儲圖片或其他多媒體大檔案 107
12.2 反模式:假設你必須使用檔案系統 108
12.2.1 檔案不支持DELETE 109
12.2.2 檔案不支持事務隔離 109
12.2.3 檔案不支持回滾操作 109
12.2.4 檔案不支持資料庫備份工具 110
12.2.5 檔案不支持SQL的訪問許可權設定 110
12.2.6 檔案不是SQL數據類型 110
12.3 如何識別反模式 111
12.4 合理使用反模式 111
12.5 解決方案:在需要時使用BLOB 類型 112
第13章 亂用索引 114
13.1 目標:最佳化性能 115
13.2 反模式:無規劃地使用索引 115
13.2.1 無索引 115
13.2.2 索引過多 116
13.2.3 索引也無能為力 117
13.3 如何識別反模式 118
13.4 合理使用反模式 119
13.5 解決方案:MENTOR你的索引 119
13.5.1 測量 120
13.5.2 解釋 121
13.5.3 挑選 122
13.5.4 測試 123
13.5.5 最佳化 123
13.5.6 重建 123
第三部分 查詢反模式
第14章 對未知的恐懼 126
14.1 目標:辨別懸空值 127
14.2 反模式:將NULL作為普通的值,反之亦然 127
14.2.1 在表達式中使用NULL 127
14.2.2 搜尋允許為空的列 128
14.2.3 在查詢參數中使用NULL 128
14.2.4 避免上述問題 128
14.3 如何識別反模式 130
14.4 合理使用反模式 130
14.5 解決方案:將NULL視為特殊值 131
14.5.1 在標量表達式中使用NULL 131
14.5.2 在布爾表達式中使用NULL 132
14.5.3 檢索NULL值 132
14.5.4 聲明NOT NULL的列 133
14.5.5 動態默認值 134
第15章 模稜兩可的分組 135
15.1 目標:獲取每組的最大值 135
15.2 反模式:引用非分組列 136
15.2.1 單值規則 136
15.2.2 我想要的查詢 137
15.3 如何識別反模式 138
15.4 合理使用反模式 139
15.5 解決方案:無歧義地使用列 140
15.5.1 只查詢功能依賴的列 140
15.5.2 使用關聯子查詢 140
15.5.3 使用衍生表 140
15.5.4 使用JOIN 141
15.5.5 對額外的列使用聚合函式 142
15.5.6 連線同組所有值 142
第16章 隨機選擇 144
16.1 目標:獲取樣本記錄 144
16.2 反模式:隨機排序 145
16.3 如何識別反模式 146
16.4 合理使用反模式 146
16.5 解決方案:沒有具體的順序 146
16.5.1 從1到最大值之間隨機選擇 146
16.5.2 選擇下一個最大值 147
16.5.3 獲取所有的鍵值,隨機選擇一個 147
16.5.4 使用偏移量選擇隨機行 148
16.5.5 專有解決方案 149
第17章 可憐人的搜尋引擎 150
17.1 目標:全文搜尋 150
17.2 反模式:模式匹配斷言 151
17.3 如何識別反模式 152
17.4 合理使用反模式 152
17.5 解決方案:使用正確的工具 152
17.5.1 資料庫擴展 153
17.5.2 第三方搜尋引擎 157
第18章 意大利麵條式查詢 162
18.1 目標:減少SQL查詢數量 162
18.2 反模式:使用一步操作解決複雜問題 163
18.2.1 副作用 163
18.2.2 那好像還不夠…… 164
18.3 如何識別反模式 165
18.4 合理使用反模式 165
18.5 解決方案:分而治之 166
18.5.1 一步一個腳印 166
18.5.2 尋找UNION標記 167
18.5.3 解決老闆的問題 167
18.5.4 使用SQL自動生成SQL 168
第19章 隱式的列 170
19.1 目標:減少輸入 171
19.2 反模式:捷徑會讓你迷失方向 171
19.2.1 破壞代碼重構 171
19.2.2 隱藏的開銷 172
19.2.3 你請求,你獲得 172
19.3 如何識別反模式 173
19.4 合理使用反模式 173
19.5 解決方案:明確列出列名 174
19.5.1 預防錯誤 174
19.5.2 你不需要它 175
19.5.3 無論如何你都需要放棄使用通配符 175
第四部分 應用程式開發反模式
第20章 明文密碼 178
20.1 目標:恢復或重置密碼 178
20.2 反模式:使用明文存儲密碼 179
20.2.1 存儲密碼 179
20.2.2 驗證密碼 180
20.2.3 在E-mail中傳送密碼 180
20.3 如何識別反模式 181
20.4 合理使用反模式 181
20.5 解決方案:先哈希,後存儲 182
20.5.1 理解哈希函式 182
20.5.2 在SQL中使用哈希 183
20.5.3 給哈希加料 183
20.5.4 在SQL中隱藏密碼 185
20.5.5 重置密碼,而非恢復密碼 186
第21章 SQL注入 188
21.1 目標:編寫SQL動態查詢 189
21.2 反模式:將未經驗證的輸入作為代碼執行 189
21.2.1 意外無處不在 190
21.2.2 對Web安全的嚴重威脅 190
21.2.3 尋找治癒良方 191
21.3 如何識別反模式 195
21.4 合理使用反模式 196
21.5 解決方案:不信任任何人 196
21.5.1 過濾輸入內容 196
21.5.2 參數化動態內容 197
21.5.3 給動態輸入的值加引號 197
21.5.4 將用戶與代碼隔離 198
21.5.5 找個可靠的人來幫你審查代碼 200
第22章 偽鍵潔癖 202
22.1 目標:整理數據 202
22.2 反模式:填充角落 203
22.2.1 不按照順序分配編號 203
22.2.2 為現有行重新編號 204
22.2.3 製造數據差異 204
22.3 如何識別反模式 205
22.4 合理使用反模式 205
22.5 解決方案:克服心裡障礙 205
22.5.1 定義行號 205
22.5.2 使用GUID 206
22.5.3 最主要的問題 207
第23章 非禮勿視 209
23.1 目標:寫更少的代碼 210
23.2 反模式:無米之炊 210
23.2.1 沒有診斷的診斷 210
23.2.2 字裡行間 211
23.3 如何識別反模式 212
23.4 合理使用反模式 213
23.5 解決方案:優雅地從錯誤中恢復 213
23.5.1 保持節奏 213
23.5.2 回溯你的腳步 214
第24章 外交豁免權 215
24.1 目標:採用最佳實踐 215
24.2 反模式:將SQL視為二等公民 216
24.3 如何識別反模式 216
24.4 合理使用反模式 217
24.5 解決方案:建立一個質量至上的文化 217
24.5.1 陳列A:編寫文檔 218
24.5.2 尋找證據:原始碼版本控制 220
24.5.3 舉證:測試 222
24.5.4 例證:同時處理多個分支 223
第25章 魔豆 225
25.1 目標:簡化MVC的模型 226
25.2 反模式:模型僅僅是活動記錄 227
25.2.1 活動記錄模式連線程式模型和資料庫結構 228
25.2.2 活動記錄模式暴露了CRUD系列函式 228
25.2.3 活動記錄模式支持弱域模型 229
25.2.4 魔豆難以進行單元測試 231
25.3 如何識別反模式 232
25.4 合理使用反模式 232
25.5 解決方案:模型包含活動記錄 232
25.5.1 領會模型的意義 233
25.5.2 將領域模型套用到實際工作中 234
25.5.3 測試簡單對象 236
25.5.4 回到地球 237
第五部分 附錄
附錄A 規範化規則 240
附錄B 參考書目 252
5.2 反模式:無視約束 44
5.2.1 假設無瑕代碼 44
5.2.2 檢查錯誤 45
5.2.3 “那不是我的錯!” 45
5.2.4 進退維谷 46
5.3 如何識別反模式 46
5.4 合理使用反模式 47
5.5 解決方案:聲明約束 47
5.5.1 支持同步修改 48
5.5.2 系統開銷過度?不見得 48
第6章 實體-屬性-值 50
6.1 目標:支持可變的屬性 50
6.2.1 查詢屬性 53
6.2.2 支持數據完整性 53
6.2.3 無法聲明強制屬性 53
6.2.4 無法使用SQL的數據類型 53
6.2.5 無法確保引用完整性 54
6.2.6 無法配置屬性名 55
6.2.7 重組列 55
6.3 如何識別反模式 56
6.4 合理使用反模式 56
6.5 解決方案:模型化子類型 57
6.5.1 單表繼承 57
6.5.2 實體表繼承 58
6.5.3 類表繼承 60
6.5.4 半結構化數據模型 61
6.5.5 後處理 61
第7章 多態關聯 64
7.1 目標:引用多個父表 65
7.2.1 定義多態關聯 65
7.2.2 使用多態關聯進行查詢 66
7.2.3 非面向對象範例 67
7.3 如何識別反模式 68
7.4 合理使用反模式 69
7.5 解決方案:讓關係變得簡單 69
7.5.1 反向引用 69
7.5.2 創建交叉表 69
7.5.3 設立交通燈 70
7.5.4 雙向查找 71
7.5.5 合併跑道 71
7.5.6 創建共用的超級表 72
第8章 多列屬性 75
8.1 目標:存儲多值屬性 75
8.2 反模式:創建多個列 76
8.2.1 查詢數據 76
8.2.2 添加及刪除值 77
8.2.3 確保唯一性 78
8.2.4 處理不斷增長的值集 78
8.3 如何識別反模式 79
8.4 合理使用反模式 79
8.5 解決方案:創建從屬表 80
第9章 元數據分裂 82
9.1 目標:支持可擴展性 83
9.2 反模式:克隆表與克隆列 83
9.2.1 不斷產生的新表 84
9.2.2 管理數據完整性 84
9.2.3 同步數據 85
9.2.4 確保唯一性 85
9.2.5 跨表查詢 86
9.2.6 同步元數據 86
9.2.7 管理引用完整性 86
9.2.8 標識元數據分裂列 87
9.3 如何識別反模式 87
9.4 合理使用反模式 88
9.5 解決方案:分區及標準化 89
9.5.1 使用水平分區 89
9.5.2 使用垂直分區 89
9.5.3 解決元數據分裂列 91
第二部分 物理資料庫設計反模式
第10章 取整錯誤 94
10.1 目標:使用小數取代整數 94
10.2 反模式:使用FLOAT類型 95
10.2.1 捨入的必要性 95
10.2.2 在SQL中使用FLOAT 96
10.3 如何識別反模式 98
10.4 合理使用反模式 98
10.5 解決方案:使用NUMERIC類型 98
第11章 每日新花樣 100
11.1 目標:限定列的有效值 100
11.2 反模式:在列定義上指定可選值 101
11.2.1 中間的是哪個 102
11.2.2 添加新口味 103
11.2.3 老的口味永不消失 103
11.2.4 可移植性低下 103
11.3 如何識別反模式 104
11.4 合理使用反模式 104
11.5 解決方案:在數據中指定值 104
11.5.1 查詢候選值集合 105
11.5.2 更新檢查表中的值 105
11.5.3 支持廢棄數據 105
11.5.4 良好的可移植性 106
第12章 幽靈檔案 107
12.1 目標:存儲圖片或其他多媒體大檔案 107
12.2 反模式:假設你必須使用檔案系統 108
12.2.1 檔案不支持DELETE 109
12.2.2 檔案不支持事務隔離 109
12.2.3 檔案不支持回滾操作 109
12.2.4 檔案不支持資料庫備份工具 110
12.2.5 檔案不支持SQL的訪問許可權設定 110
12.2.6 檔案不是SQL數據類型 110
12.3 如何識別反模式 111
12.4 合理使用反模式 111
12.5 解決方案:在需要時使用BLOB 類型 112
第13章 亂用索引 114
13.1 目標:最佳化性能 115
13.2 反模式:無規劃地使用索引 115
13.2.1 無索引 115
13.2.2 索引過多 116
13.2.3 索引也無能為力 117
13.3 如何識別反模式 118
13.4 合理使用反模式 119
13.5 解決方案:MENTOR你的索引 119
13.5.1 測量 120
13.5.2 解釋 121
13.5.3 挑選 122
13.5.4 測試 123
13.5.5 最佳化 123
13.5.6 重建 123
第三部分 查詢反模式
第14章 對未知的恐懼 126
14.1 目標:辨別懸空值 127
14.2 反模式:將NULL作為普通的值,反之亦然 127
14.2.1 在表達式中使用NULL 127
14.2.2 搜尋允許為空的列 128
14.2.3 在查詢參數中使用NULL 128
14.2.4 避免上述問題 128
14.3 如何識別反模式 130
14.4 合理使用反模式 130
14.5 解決方案:將NULL視為特殊值 131
14.5.1 在標量表達式中使用NULL 131
14.5.2 在布爾表達式中使用NULL 132
14.5.3 檢索NULL值 132
14.5.4 聲明NOT NULL的列 133
14.5.5 動態默認值 134
第15章 模稜兩可的分組 135
15.1 目標:獲取每組的最大值 135
15.2 反模式:引用非分組列 136
15.2.1 單值規則 136
15.2.2 我想要的查詢 137
15.3 如何識別反模式 138
15.4 合理使用反模式 139
15.5 解決方案:無歧義地使用列 140
15.5.1 只查詢功能依賴的列 140
15.5.2 使用關聯子查詢 140
15.5.3 使用衍生表 140
15.5.4 使用JOIN 141
15.5.5 對額外的列使用聚合函式 142
15.5.6 連線同組所有值 142
第16章 隨機選擇 144
16.1 目標:獲取樣本記錄 144
16.2 反模式:隨機排序 145
16.3 如何識別反模式 146
16.4 合理使用反模式 146
16.5 解決方案:沒有具體的順序 146
16.5.1 從1到最大值之間隨機選擇 146
16.5.2 選擇下一個最大值 147
16.5.3 獲取所有的鍵值,隨機選擇一個 147
16.5.4 使用偏移量選擇隨機行 148
16.5.5 專有解決方案 149
第17章 可憐人的搜尋引擎 150
17.1 目標:全文搜尋 150
17.2 反模式:模式匹配斷言 151
17.3 如何識別反模式 152
17.4 合理使用反模式 152
17.5 解決方案:使用正確的工具 152
17.5.1 資料庫擴展 153
17.5.2 第三方搜尋引擎 157
第18章 意大利麵條式查詢 162
18.1 目標:減少SQL查詢數量 162
18.2 反模式:使用一步操作解決複雜問題 163
18.2.1 副作用 163
18.2.2 那好像還不夠…… 164
18.3 如何識別反模式 165
18.4 合理使用反模式 165
18.5 解決方案:分而治之 166
18.5.1 一步一個腳印 166
18.5.2 尋找UNION標記 167
18.5.3 解決老闆的問題 167
18.5.4 使用SQL自動生成SQL 168
第19章 隱式的列 170
19.1 目標:減少輸入 171
19.2 反模式:捷徑會讓你迷失方向 171
19.2.1 破壞代碼重構 171
19.2.2 隱藏的開銷 172
19.2.3 你請求,你獲得 172
19.3 如何識別反模式 173
19.4 合理使用反模式 173
19.5 解決方案:明確列出列名 174
19.5.1 預防錯誤 174
19.5.2 你不需要它 175
19.5.3 無論如何你都需要放棄使用通配符 175
第四部分 應用程式開發反模式
第20章 明文密碼 178
20.1 目標:恢復或重置密碼 178
20.2 反模式:使用明文存儲密碼 179
20.2.1 存儲密碼 179
20.2.2 驗證密碼 180
20.2.3 在E-mail中傳送密碼 180
20.3 如何識別反模式 181
20.4 合理使用反模式 181
20.5 解決方案:先哈希,後存儲 182
20.5.1 理解哈希函式 182
20.5.2 在SQL中使用哈希 183
20.5.3 給哈希加料 183
20.5.4 在SQL中隱藏密碼 185
20.5.5 重置密碼,而非恢復密碼 186
第21章 SQL注入 188
21.1 目標:編寫SQL動態查詢 189
21.2 反模式:將未經驗證的輸入作為代碼執行 189
21.2.1 意外無處不在 190
21.2.2 對Web安全的嚴重威脅 190
21.2.3 尋找治癒良方 191
21.3 如何識別反模式 195
21.4 合理使用反模式 196
21.5 解決方案:不信任任何人 196
21.5.1 過濾輸入內容 196
21.5.2 參數化動態內容 197
21.5.3 給動態輸入的值加引號 197
21.5.4 將用戶與代碼隔離 198
21.5.5 找個可靠的人來幫你審查代碼 200
第22章 偽鍵潔癖 202
22.1 目標:整理數據 202
22.2 反模式:填充角落 203
22.2.1 不按照順序分配編號 203
22.2.2 為現有行重新編號 204
22.2.3 製造數據差異 204
22.3 如何識別反模式 205
22.4 合理使用反模式 205
22.5 解決方案:克服心裡障礙 205
22.5.1 定義行號 205
22.5.2 使用GUID 206
22.5.3 最主要的問題 207
第23章 非禮勿視 209
23.1 目標:寫更少的代碼 210
23.2 反模式:無米之炊 210
23.2.1 沒有診斷的診斷 210
23.2.2 字裡行間 211
23.3 如何識別反模式 212
23.4 合理使用反模式 213
23.5 解決方案:優雅地從錯誤中恢復 213
23.5.1 保持節奏 213
23.5.2 回溯你的腳步 214
第24章 外交豁免權 215
24.1 目標:採用最佳實踐 215
24.2 反模式:將SQL視為二等公民 216
24.3 如何識別反模式 216
24.4 合理使用反模式 217
24.5 解決方案:建立一個質量至上的文化 217
24.5.1 陳列A:編寫文檔 218
24.5.2 尋找證據:原始碼版本控制 220
24.5.3 舉證:測試 222
24.5.4 例證:同時處理多個分支 223
第25章 魔豆 225
25.1 目標:簡化MVC的模型 226
25.2 反模式:模型僅僅是活動記錄 227
25.2.1 活動記錄模式連線程式模型和資料庫結構 228
25.2.2 活動記錄模式暴露了CRUD系列函式 228
25.2.3 活動記錄模式支持弱域模型 229
25.2.4 魔豆難以進行單元測試 231
25.3 如何識別反模式 232
25.4 合理使用反模式 232
25.5 解決方案:模型包含活動記錄 232
25.5.1 領會模型的意義 233
25.5.2 將領域模型套用到實際工作中 234
25.5.3 測試簡單對象 236
25.5.4 回到地球 237
第五部分 附錄
附錄A 規範化規則 240
附錄B 參考書目 252