TOP
GOGO開學趣,參考書應有盡有
SQL反模式(簡體書)
滿額折

SQL反模式(簡體書)

商品資訊

人民幣定價:59 元
定價
:NT$ 354 元
優惠價
87308
絕版無法訂購
商品簡介
作者簡介
名人/編輯推薦
目次
書摘/試閱

商品簡介

《SQL反模式》是一本廣受好評的SQL圖書。它介紹了如何避免在SQL的使用和開發中陷入一些常見卻經常被忽略的誤區。它通過講述各種具體的案例,以及開發人員和使用人員在面對這些案例時經常采用的錯誤解決方案,來介紹如何識別、利用這些陷阱,以及面對問題時正確的解決手段。另外,《SQL反模式》還涉及了SQL的各級范式和針對它們的正確理解。
《SQL反模式》適合SQL數據庫開發人員與管理人員閱讀。

作者簡介

作者:(美國)卡爾文 (Bill Karwin) 譯者:譚振林 Push Chen

卡爾文,作為軟件工程師、咨詢師和管理者,他在20年間開發并支持了各種各樣的應用、程序庫以及服務器,如PHP 5的Zend Framework, Interbase關系型數據庫,以及Enhydra Java應用服務器等。他一直無私地分享他的專業知識,來幫助其他程序員提高效率、獲得成功。他曾以各種方式回答了上千個關于SQL的疑問,其中不乏一些 嚴重但又經常被忽略的問題。
譚振林,資深研發人員,曾連任五屆微軟最有價值專家,出版多本專業譯著,目前擔任產品總監,在互聯網產品路上孜孜探索。
Push Chen,專注于大數據量分布式存儲及緩存的後臺服務設計與開發,現任職于盛大在線推他項目組。

名人/編輯推薦

《SQL反模式》:深入剖析數據庫編程常見錯誤,提升SQL功力的實用寶典,大師指點令人茅塞頓開。
多數軟件開發人員并不是SQL專家,很多人對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 反模式:使用泛型屬性表 51
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 反模式:使用雙用途外鍵 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

書摘/試閱

你的老板帶著兩份打印出來的報告過來找你,說:“會計部的人說我們給出的這一季度報告和上季度報告有些差異。我正在看這兩份報告,的確有差異,大部分最新的資產消失了。怎么回事?”
你看著這兩份報告,發現這些差異看起來很眼熟。“不,每樣東西都在那里。為了使所有的記錄編號都是連續的,你讓我整理過一次數據庫。你說會計們由于數字之間的斷檔,一直在追問你中間那些不見了的資產是怎么回事。
“因此,我重新為一些記錄編了號,然後把他們放在了原來的空行。現在沒有斷檔了——從1到12340之間的每個數字都對應一個資產。所有的東西都在那里,只是有些改變了編號并且移到上面去了。是你告訴我這么做的。”
老板不住地搖頭。“但這不是我想要的。會計人員是根據資產編號來跟蹤設備的折舊狀況的。每個設備的編號要在每個季度的報告中保持一致。除此之外,所有的資產編號都被打印并且貼在了對應的設備上。要花好幾周的時間來重新為整個公司的設備貼新的標簽。你能把所有的ID編號改回原來的嗎?”

購物須知

大陸出版品因裝訂品質及貨運條件與台灣出版品落差甚大,除封面破損、內頁脫落等較嚴重的狀態,其餘商品將正常出貨。

特別提醒:部分書籍附贈之內容(如音頻mp3或影片dvd等)已無實體光碟提供,需以QR CODE 連結至當地網站註冊“並通過驗證程序”,方可下載使用。

無現貨庫存之簡體書,將向海外調貨:
海外有庫存之書籍,等候約45個工作天;
海外無庫存之書籍,平均作業時間約60個工作天,然不保證確定可調到貨,尚請見諒。

為了保護您的權益,「三民網路書店」提供會員七日商品鑑賞期(收到商品為起始日)。

若要辦理退貨,請在商品鑑賞期內寄回,且商品必須是全新狀態與完整包裝(商品、附件、發票、隨貨贈品等)否則恕不接受退貨。

優惠價:87 308
絕版無法訂購

暢銷榜

客服中心

收藏

會員專區