第1章 引言
1.1 誰需要這本書
1.2 本書內容
1.2.1 本書結構
1.2.2 反模式分解
1.3 本書未涉及的內容
1.4 規(guī)約
1.5 范例數據庫
1.6 致謝
第一部分 邏輯型數據庫設計反模式
第2章 亂穿馬路
2.1 目標:存儲多值屬性
2.2 反模式:格式化的逗號分隔列表
2.2.1 查詢指定賬號的產品
2.2.2 查詢指定產品的賬號
2.2.3 執(zhí)行聚合查詢
2.2.4 更新指定產品的賬號
2.2.5 驗證產品ID
2.2.6 選擇合適的分隔符
2.2.7 列表長度限制
2.3 如何識別反模式
2.4 合理使用反模式
2.5 解決方案:創(chuàng)建一張交叉表
2.5.1 通過賬號查詢產品和反過來查詢
2.5.2 執(zhí)行聚合查詢
2.5.3 更新指定產品的相關聯系人
2.5.4 驗證產品ID
2.5.5 選擇分隔符
2.5.6 列表長度限制
2.5.7 其他使用交叉表的好處
第3章 單純的樹
3.1 目標:分層存儲與查詢
3.2 反模式:總是依賴父節(jié)點
3.2.1 使用鄰接表查詢樹
3.2.2 使用鄰接表維護樹
3.3 如何識別反模式
3.4 合理使用反模式
3.5 解決方案:使用其他樹模型
3.5.1 路徑枚舉
3.5.2 嵌套集
3.5.3 閉包表
3.5.4 你該使用哪種設計
第4章 需要ID
4.1 目標:建立主鍵規(guī)范
4.2 反模式:以不變應萬變
4.2.1 冗余鍵值
4.2.2 允許重復項
4.2.3 意義不明的關鍵字
4.2.4 使用USING關鍵字
4.2.5 使用組合鍵之難
4.3 如何識別反模式
4.4 合理使用反模式
4.5 解決方案:裁剪設計
4.5.1 直截了當地描述設計
4.5.2 打破傳統
4.5.3 擁抱自然鍵和組合鍵
第5章 不用鑰匙的入口
5.1 目標:簡化數據庫架構
5.2 反模式:無視約束
5.2.1 假設無瑕代碼
5.2.2 檢查錯誤
5.2.3 “那不是我的錯!”
5.2.4 進退維谷
5.3 如何識別反模式
5.4 合理使用反模式
5.5 解決方案:聲明約束
5.5.1 支持同步修改
5.5.2 系統開銷過度?不見得
第6章 實體-屬性-值
6.1 目標:支持可變的屬性
6.2 反模式:使用泛型屬性表
6.2.1 查詢屬性
6.2.2 支持數據完整性
6.2.3 無法聲明強制屬性
6.2.4 無法使用SQL的數據類型
6.2.5 無法確保引用完整性
6.2.6 無法配置屬性名
6.2.7 重組列
6.3 如何識別反模式
6.4 合理使用反模式
6.5 解決方案:模型化子類型
6.5.1 單表繼承
6.5.2 實體表繼承
6.5.3 類表繼承
6.5.4 半結構化數據模型
6.5.5 后處理
第7章 多態(tài)關聯
7.1 目標:引用多個父表
7.2 反模式:使用雙用途外鍵
7.2.1 定義多態(tài)關聯
7.2.2 使用多態(tài)關聯進行查詢
7.2.3 非面向對象范例
7.3 如何識別反模式
7.4 合理使用反模式
7.5 解決方案:讓關系變得簡單
7.5.1 反向引用
7.5.2 創(chuàng)建交叉表
7.5.3 設立交通燈
7.5.4 雙向查找
7.5.5 合并跑道
7.5.6 創(chuàng)建共用的超級表
第8章 多列屬性
8.1 目標:存儲多值屬性
8.2 反模式:創(chuàng)建多個列
8.2.1 查詢數據
8.2.2 添加及刪除值
8.2.3 確保唯一性
8.2.4 處理不斷增長的值集
8.3 如何識別反模式
8.4 合理使用反模式
8.5 解決方案:創(chuàng)建從屬表
第9章 元數據分裂
9.1 目標:支持可擴展性
9.2 反模式:克隆表與克隆列
9.2.1 不斷產生的新表
9.2.2 管理數據完整性
9.2.3 同步數據
9.2.4 確保唯一性
9.2.5 跨表查詢
9.2.6 同步元數據
9.2.7 管理引用完整性
9.2.8 標識元數據分裂列
9.3 如何識別反模式
9.4 合理使用反模式
9.5 解決方案:分區(qū)及標準化
9.5.1 使用水平分區(qū)
9.5.2 使用垂直分區(qū)
9.5.3 解決元數據分裂列
第二部分 物理數據庫設計反模式
第10章 取整錯誤
10.1 目標:使用小數取代整數
10.2 反模式:使用FLOAT類型
10.2.1 舍入的必要性
10.2.2 在SQL中使用FLOAT
10.3 如何識別反模式
10.4 合理使用反模式
10.5 解決方案:使用NUMERIC類型
第11章 每日新花樣
11.1 目標:限定列的有效值
11.2 反模式:在列定義上指定可選值
11.2.1 中間的是哪個
11.2.2 添加新口味
11.2.3 老的口味永不消失
11.2.4 可移植性低下
11.3 如何識別反模式
11.4 合理使用反模式
11.5 解決方案:在數據中指定值
11.5.1 查詢候選值集合
11.5.2 更新檢查表中的值
11.5.3 支持廢棄數據
11.5.4 良好的可移植性
第12章 幽靈文件
12.1 目標:存儲圖片或其他多媒體大文件
12.2 反模式:假設你必須使用文件系統
12.2.1 文件不支持DELETE
12.2.2 文件不支持事務隔離
12.2.3 文件不支持回滾操作
12.2.4 文件不支持數據庫備份工具
12.2.5 文件不支持SQL的訪問權限設置
12.2.6 文件不是SQL數據類型
12.3 如何識別反模式
12.4 合理使用反模式
12.5 解決方案:在需要時使用BLOB 類型
第13章 亂用索引
13.1 目標:優(yōu)化性能
13.2 反模式:無規(guī)劃地使用索引
13.2.1 無索引
13.2.2 索引過多
13.2.3 索引也無能為力
13.3 如何識別反模式
13.4 合理使用反模式
13.5 解決方案:MENTOR你的索引
13.5.1 測量
13.5.2 解釋
13.5.3 挑選
13.5.4 測試
13.5.5 優(yōu)化
13.5.6 重建
第三部分 查詢反模式
第14章 對未知的恐懼
14.1 目標:辨別懸空值
14.2 反模式:將NULL作為普通的值,反之亦然
14.2.1 在表達式中使用NULL
14.2.2 搜索允許為空的列
14.2.3 在查詢參數中使用NULL
14.2.4 避免上述問題
14.3 如何識別反模式
14.4 合理使用反模式
14.5 解決方案:將NULL視為特殊值
14.5.1 在標量表達式中使用NULL
14.5.2 在布爾表達式中使用NULL
14.5.3 檢索NULL值
14.5.4 聲明NOT NULL的列
14.5.5 動態(tài)默認值
第15章 模棱兩可的分組
15.1 目標:獲取每組的最大值
15.2 反模式:引用非分組列
15.2.1 單值規(guī)則
15.2.2 我想要的查詢
15.3 如何識別反模式
15.4 合理使用反模式
15.5 解決方案:無歧義地使用列
15.5.1 只查詢功能依賴的列
15.5.2 使用關聯子查詢
15.5.3 使用衍生表
15.5.4 使用JOIN
15.5.5 對額外的列使用聚合函數
15.5.6 連接同組所有值
第16章 隨機選擇
16.1 目標:獲取樣本記錄
16.2 反模式:隨機排序
16.3 如何識別反模式
16.4 合理使用反模式
16.5 解決方案:沒有具體的順序
16.5.1 從1到最大值之間隨機選擇
16.5.2 選擇下一個最大值
16.5.3 獲取所有的鍵值,隨機選擇一個
16.5.4 使用偏移量選擇隨機行
16.5.5 專有解決方案
第17章 可憐人的搜索引擎
17.1 目標:全文搜索
17.2 反模式:模式匹配斷言
17.3 如何識別反模式
17.4 合理使用反模式
17.5 解決方案:使用正確的工具
17.5.1 數據庫擴展
17.5.2 第三方搜索引擎
第18章 意大利面條式查詢
18.1 目標:減少SQL查詢數量
18.2 反模式:使用一步操作解決復雜問題
18.2.1 副作用
18.2.2 那好像還不夠……
18.3 如何識別反模式
18.4 合理使用反模式
18.5 解決方案:分而治之
18.5.1 一步一個腳印
18.5.2 尋找UNION標記
18.5.3 解決老板的問題
18.5.4 使用SQL自動生成SQL
第19章 隱式的列
19.1 目標:減少輸入
19.2 反模式:捷徑會讓你迷失方向
19.2.1 破壞代碼重構
19.2.2 隱藏的開銷
19.2.3 你請求,你獲得
19.3 如何識別反模式
19.4 合理使用反模式
19.5 解決方案:明確列出列名
19.5.1 預防錯誤
19.5.2 你不需要它
19.5.3 無論如何你都需要放棄使用通配符
第四部分 應用程序開發(fā)反模式
第20章 明文密碼
20.1 目標:恢復或重置密碼
20.2 反模式:使用明文存儲密碼
20.2.1 存儲密碼
20.2.2 驗證密碼
20.2.3 在E-mail中發(fā)送密碼
20.3 如何識別反模式
20.4 合理使用反模式
20.5 解決方案:先哈希,后存儲
20.5.1 理解哈希函數
20.5.2 在SQL中使用哈?!?br />20.5.3 給哈希加料
20.5.4 在SQL中隱藏密碼
20.5.5 重置密碼,而非恢復密碼
第21章 SQL注入
21.1 目標:編寫SQL動態(tài)查詢
21.2 反模式:將未經驗證的輸入作為代碼執(zhí)行
21.2.1 意外無處不在
21.2.2 對Web安全的嚴重威脅
21.2.3 尋找治愈良方
21.3 如何識別反模式
21.4 合理使用反模式
21.5 解決方案:不信任任何人
21.5.1 過濾輸入內容
21.5.2 參數化動態(tài)內容
21.5.3 給動態(tài)輸入的值加引號
21.5.4 將用戶與代碼隔離
21.5.5 找個可靠的人來幫你審查代碼
第22章 偽鍵潔癖
22.1 目標:整理數據
22.2 反模式:填充角落
22.2.1 不按照順序分配編號
22.2.2 為現有行重新編號
22.2.3 制造數據差異
22.3 如何識別反模式
22.4 合理使用反模式
22.5 解決方案:克服心里障礙
22.5.1 定義行號
22.5.2 使用GUID
22.5.3 最主要的問題
第23章 非禮勿視
23.1 目標:寫更少的代碼
23.2 反模式:無米之炊
23.2.1 沒有診斷的診斷
23.2.2 字里行間
23.3 如何識別反模式
23.4 合理使用反模式
23.5 解決方案:優(yōu)雅地從錯誤中恢復
23.5.1 保持節(jié)奏
23.5.2 回溯你的腳步
第24章 外交豁免權
24.1 目標:采用最佳實踐
24.2 反模式:將SQL視為二等公民
24.3 如何識別反模式
24.4 合理使用反模式
24.5 解決方案:建立一個質量至上的文化
24.5.1 陳列A:編寫文檔
24.5.2 尋找證據:源代碼版本控制
24.5.3 舉證:測試
24.5.4 例證:同時處理多個分支
第25章 魔豆
25.1 目標:簡化MVC的模型
25.2 反模式:模型僅僅是活動記錄
25.2.1 活動記錄模式連接程序模型和數據庫結構
25.2.2 活動記錄模式暴露了CRUD系列函數
25.2.3 活動記錄模式支持弱域模型
25.2.4 魔豆難以進行單元測試
25.3 如何識別反模式
25.4 合理使用反模式
25.5 解決方案:模型包含活動記錄
25.5.1 領會模型的意義
25.5.2 將領域模型應用到實際工作中
25.5.3 測試簡單對象
25.5.4 回到地球
第五部分 附錄
附錄A 規(guī)范化規(guī)則
附錄B 參考書目