SQL反模式

SQL反模式 pdf epub mobi txt 电子书 下载 2026

出版者:人民邮电出版社
作者:[美] Bill Karwin
出品人:
页数:253
译者:谭振林
出版时间:2011-9
价格:59.00元
装帧:平装
isbn号码:9787115261274
丛书系列:图灵程序设计丛书·数据库系列
图书标签:
  • SQL
  • 数据库
  • 数据库设计
  • 反模式
  • 计算机
  • 编程
  • DataBase
  • 计算机科学
  • SQL
  • 数据库
  • 反模式
  • 设计模式
  • 性能优化
  • 数据建模
  • SQL Server
  • MySQL
  • PostgreSQL
  • 数据库设计
想要找书就要到 小美书屋
立刻按 ctrl+D收藏本页
你会得到大惊喜!!

具体描述

《SQL反模式》是一本广受好评的SQL图书。它介绍了如何避免在SQL的使用和开发中陷入一些常见却经常被忽略的误区。它通过讲述各种具体的案例,以及开发人员和使用人员在面对这些案例时经常采用的错误解决方案,来介绍如何识别、利用这些陷阱,以及面对问题时正确的解决手段。另外,《SQL反模式》还涉及了SQL的各级范式和针对它们的正确理解。

《SQL反模式》适合SQL数据库开发人员与管理人员阅读。

作者简介

Bill Karwin作为软件工程师、咨询师和管理者,他在20年间开发并支持了各种各样的应用、程序库以及服务器,如PHP 5的Zend Framework, Interbase关系型数据库,以及Enhydra Java应用服务器等。他一直无私地分享他的专业知识,来帮助其他程序员提高效率、获得成功。他曾以各种方式回答了上千个关于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
· · · · · · (收起)

读后感

评分

这本书讲的东西,只有维护过一堆烂代码和槽糕的数据库设计的人才能体会。 至少没有外键,也不设主键的系统我是见过的 本书讨论的主题是非常实用的,而且是开发中的一些重要问题 比如树形结构,随机行选取,外键的使用,密码的存储,文件的存储等等 作者总体来说是把数据一致性...

评分

《SQL反模式》,英文版2010年7月出版,中文版2011年9月出版。还算比较新。英文名:“SQL Antipatterns: Avoiding the Pitfalls of Database Programming”(SQL反模式:避免数据库开发中的陷阱)。 所谓反模式,就是做的不好的模式。也就是前人的经验教训。 感觉作者功力比较高...  

评分

这本书讲的东西,只有维护过一堆烂代码和槽糕的数据库设计的人才能体会。 至少没有外键,也不设主键的系统我是见过的 本书讨论的主题是非常实用的,而且是开发中的一些重要问题 比如树形结构,随机行选取,外键的使用,密码的存储,文件的存储等等 作者总体来说是把数据一致性...

评分

《SQL反模式》,英文版2010年7月出版,中文版2011年9月出版。还算比较新。英文名:“SQL Antipatterns: Avoiding the Pitfalls of Database Programming”(SQL反模式:避免数据库开发中的陷阱)。 所谓反模式,就是做的不好的模式。也就是前人的经验教训。 感觉作者功力比较高...  

评分

这本书讲的东西,只有维护过一堆烂代码和槽糕的数据库设计的人才能体会。 至少没有外键,也不设主键的系统我是见过的 本书讨论的主题是非常实用的,而且是开发中的一些重要问题 比如树形结构,随机行选取,外键的使用,密码的存储,文件的存储等等 作者总体来说是把数据一致性...

用户评价

评分

如果你期望读到如何使用最新的云数据库特性或者如何配置存储过程,那么这本书可能不是你的首选。它聚焦的战场,是那些在你日常SQL脚本中潜伏着的陷阱。它的深度在于对关系代数和查询执行计划的深刻理解,并将其转化为实际可操作的编码规则。书中对于“数据冗余的艺术”的探讨尤其引人深思,它辩证地看待了范式与性能的对立统一,很多教科书里被视为异端的做法,在这里却被放在了特定场景下的最优解进行分析。这本书的写作风格非常具有说服力,它不像是在“教导”,而更像是在“分享经验的智慧结晶”。我感觉自己过去写SQL像是在蒙眼开车,而读完这本书后,我至少学会了如何看清前方的路况,并且知道在哪个路口应该选择哪条捷径。这是一本值得反复翻阅,并在每次代码审查时都拿出来对照的工具书。

评分

这本关于数据库设计的书,确实让我对传统的SQL范式有了全新的认识。作者没有停留于教科书式的理论灌输,而是深入剖析了那些在实际项目中屡见不鲜的“坏实践”。读起来就像是跟一位经验丰富的老兵在交流心得,他会毫不留情地指出,为什么你觉得写起来很爽的那个JOIN,在数据量上去之后会变成性能杀手。书中对复杂查询的重构思路尤其精彩,比如如何将深层嵌套的子查询优化为更易于维护的CTE(Common Table Expression),或者在不牺牲查询逻辑的前提下,通过调整索引策略来大幅提升检索速度。我尤其喜欢他提出的“慢查询画像”分析方法,那套系统性的诊断流程,完全可以作为我们团队日常维护的Checklist。这本书的价值不在于教你写出第一个SELECT语句,而在于教你如何用更优雅、更健壮的方式处理那些在生产环境中已经“生病”的SQL代码。对于那些刚刚从初级SQL开发者转向需要负责系统架构的人来说,这绝对是一剂良药,能帮你提前规避很多未来的“坑”。

评分

坦白说,我拿起这本书是抱着怀疑态度的,毕竟市面上关于数据库优化的书已经非常多了。但这本书的视角非常独特,它聚焦于那些“看似正确实则有害”的编码习惯。它不像很多优化书籍那样,只教你如何使用工具去分析,而是从SQL语言设计哲学层面去解构问题。比如,它深入分析了ORM框架在生成SQL时常犯的错误,那种N+1查询的隐蔽性,以及如何通过精妙的批处理机制来规避。对于那些习惯了使用特定数据库(如MySQL或PostgreSQL)的用户来说,书中跨平台的视角也很有启发性,它会让你思考底层逻辑,而不是仅仅依赖特定平台的内置优化器。我发现自己过去依赖的一些“小技巧”,在这本书里都被放在了“需要谨慎使用”的列表中,这让我对自己的编码习惯进行了一次彻底的自检。这本书更像是一份高级工程师的内参,它告诉你,什么该做,什么不该做,以及背后的原因是什么。

评分

这本书最大的魅力在于其对“渐进式退化”的描述。很多我们认为稳定运行的系统,其实是在性能下降的道路上缓慢滑行,而我们却浑然不觉。作者通过大量的图表和代码片段,形象地展示了数据量增长、索引失效、以及查询逻辑复杂化是如何共同作用,最终拖垮整个系统的过程。我印象最深的是关于“死锁与活锁”那一章节,它没有停留在理论定义上,而是通过模拟高并发场景,展示了不同锁粒度策略带来的真实业务影响。这本书对初级DBA的帮助可能更多在于建立规范,但对于架构师而言,它提供了一种预见未来的能力——预见代码在未来负载下的表现。阅读过程非常流畅,专业术语的解释恰到好处,不会让人感到晦涩难懂,但信息密度极高,我常常需要停下来,对照自己的项目代码去思考如何应用这些理念。

评分

我之前总觉得,只要数据类型选对了,索引建好了,写出来的SQL基本就算合格了。这本书彻底颠覆了我的看法。它强调的不是技术细节的堆砌,而是一种全局的、面向业务需求的数据库思维。比如,书中对“过度规范化”和“反范式设计”的探讨,简直是醍醐灌顶。在某些高并发读写的场景下,严格遵循第三范式反而会成为性能的枷锁,作者给出的那些权衡取舍的案例,都是带着血泪教训的实战总结。我特别欣赏作者对于事务隔离级别在实际应用中的细致解读,它不再是抽象的概念,而是直接与数据一致性和并发冲突挂钩。读完后,我在重构我们那个历史遗留的库存管理模块时,果断采纳了书中提到的“物化视图预计算”策略,原本需要等待数秒的报表,现在几乎是秒开。这本书的行文风格是那种非常直接且富有洞察力的,没有一句废话,全是干货。

评分

虽然大多数例子还是PHP的,但是多次提到Rails框架..

评分

不错,今天站着看了2章。

评分

浅显易懂,难得能一口气看完一本书了。最后把 ActiveRecord 翻成活动记录模式很别扭。

评分

拿到也就翻翻吧. 站读, 前面讲某树形结构的一章, 偶是想到了更好的方法... 就真没仔细考虑更新代价?! 哪有说的那么小.

评分

虽然大多数例子还是PHP的,但是多次提到Rails框架..

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2026 book.quotespace.org All Rights Reserved. 小美书屋 版权所有