`
trydofor
  • 浏览: 150508 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

《数据库重构》读书笔记

阅读更多

http://www.trydofor.com/a9w3-auhome/trydofor/article/2010/0607170631/body.htm

《数据库重构》读书笔记
作者:臭豆腐[trydofor.com]
日期:2010-04-27
授权:署名-非商业-保持一致 1.0 协议
声明:拷贝、分发、呈现和表演本作品,请保留以上全部信息。

 

文档目录
1. 倒序的读后感
最后写的读后感总是在最前,这样可以最快浮现整体的印象。
书不厚,累计耗时3,4天,却拖了一个半月。
作者啰嗦点,译者外行点,豆腐从咬文嚼字到走马观花。

豆腐太需要数据和数据库重构了,因为:
  • 表的字段太多,200,300的那么多。
  • 每两周一次发布都有schema的更新,不限于改数据,增字段,换类型,变主键。
  • 冗余数据多,条条大道通罗马,好是不好。
  • 表很多,主表400余,辅表亦然。
  • 数据小海量,上亿,上十G。基本垂直优化到了尽头。

数据和数据库重构,基本上都是组合拳,牵涉到所有角色。
书中是分节动作,总结起来就是做事6要素:
首先What,Why,How,然后Where,When,最后安排Who。

2. 正文前的唠叨
【2010-04-27】
数据库重构/机械工业出版社/ISBN7-111-20209-0/32元。
Refactoring Database Evolutionary Database Design
笔记格式:A9mark(http://code.google.com/p/a9mark/)

在Credit,司空见惯的是Schema改变和数据迁移。
也许本书能有新的答案,或引起思考。

【赞誉】光环效应,比较流行。适合学习如何表示赞叹。
【序】四个人写了序,头衔不小,可惜一个也不认识。
【前言】“关于封面”原版的确是桥,中文版却弄个“烟灰缸”。
【致谢】很人性,但TMD没“感谢国家”。

3. 第一章 演进式数据库开发
【引言】瀑布是美妙的旅游景点。但用来组织软件开发项目,
瀑布式却是一种特别差劲的策略。-- Scott Ambler。
【P1|P1】演进式的,以迭代和增量方式工作,软件过程,方法学。
【BTW】RUP,XP,Scrum,DSDM,水晶方法,TSP,AUP,EUP,FDD,RAD都没用过 :(
【P1|P2】有效协同工作的方法,白板 > 电话 > EMail > 详细文档。
【C1.1】代码重构,保持行为语义,DB重构要保持行为和信息语义。
【C1.2】JIT(Just In Time) 即时生产,够用就行。
【C1.3|T】TFD(Test First Development)编写代码前必须写一个会失败的测试。
【C1.3|B】TDD是TFD和重构的结合。
【C1.4】DB重构前准备工作。按部就班。
【C1.5】图1.5 为用户提供安全性的逻辑沙盒。
【C1.6】障碍是文化最大,工具其次。

4. 第二章 数据库重构
【引言】一旦你冻结了设计,他就开始变得过时。-- Fred Brooks
【C2.1】现在的代码是否是最好的设计,使我能够加入新特征。先重构在加新。
【C2.2.1】单应用的重构过程:人员结对,旧测试成功,新测试失败,移动列,
重构程序,新测试成功,旧测试失败,旧测试重构,旧测试成功。
备份数据,复制列,测试成功,删除列,测试成功。
【C2.2.2】多应用的重构过程:过程同单应用,但转换期内,新旧并存并同步数据。
【P12|B】信息语义只从信息使用者角度,数据库中信息的意义。
【P13|M】行为语义目标是保持黑盒功能性不变。
【C2.4】DB坏味:多用途列/表;重复数据;列太多;行太多;智能列;害怕变化。
【C2.6】耦合不会降到0,但肯定会到受管理的程度。

5. 第三章 数据库重构过程
【引言】
新的科学真理不是通过说服它的对手并让他们看到光明而取得胜利的,而是因为
它的对手最终死去,新成长起来的一代熟悉新的科学真理。-- Max Planck
【P20】迭代活动列表及流程图,注意回归测试和版本控制。
【C3.1】与DBA一起思考,重构的意义,必要性,代价。一次做一个,做好。
【C3.2】转换和重构,数据源。分析并理解问题,识别问题的多个方面。
【C3.3】转换期内,新旧共存,可达几季度或几年,比较恐怖。
【C3.4】SQLUnit java的。前,中,后测试,必要时进行回归测试。
【C3.5】Schema的版本。
【C3.6】设计越清晰,就越少需要文档。
【C3.7-C3.11】罗列了一次过程,视乎有点啰嗦。

6. 第四章 部署到生成环境
【引言】如果我们不改变方向,不久就会到达我们想去的地方。-- Dr. Irwin Corey
【C4.1】沙盒:开发(经常)--项目集成(受控)--生成前(高受控)--生成
【C4.4】部署过程图,这个还行。
【BTW】前四章,比较墨迹,各小节标题的概括性很高。

7. 第五章 数据库重构策略
【2010-05-18】
【引言】今天比昨天知道得多是今天的好消息,而不是昨天的坏消息。-- Ron Jeffries
【C5.1】原子级的小变更,步步为营。
【C5.2】唯一标识策略:FIFO,UUID,其他标识。
【C5.4】DB标识DB(DB配置表)。UPDATE DatabaseConfiguration SET SchemaVersion=17;
【C5.5】schema 同步策略:trigger,view,program的优缺点。
【C5.6】个人觉得:计划周详,应该缩短转换期,而不是长。
【C5.7】成了委员会,一起研究。
【C5.9-C5.12】管理好脚本(SQL等)
【C5.13】政治斗争,囧。还好Credit没这东西。
【C5.15】www.agiledata.org
【BTW】这一章,领启的很好,信息量足。

8. 第六章 结构重构
【BTW】跨过前面的场景铺垫,现在开始摆弄刀法。
【C6.1】常见问题:触发器死循环。
发现和修复,视图,触发器,存储过程,耦合表(隐式耦合)。
确定转换期。
【C6.2】删除列
【P45】临时表;海量数据(SET UNUSED);外键处理,视图封装表。
【P46】以防万一,保存主键和删除列 Create Table ... as select ...
【P47】演示代码,仅仅演示,不要使用。
【C6.3】删除表:数据完整性。(这是个什么样的场景呢)
【C6.4】删视图:视图常常伴随着安全访问控制。最小公分母法
【C6.5】引入计算列:同步策略,定期批处理或数据源触发器。确定源数据。
【C6.6】引入替代键:减少耦合,增加一致性,改进性能。
【P53|B】自然键(natural key)于替代键(surrogate key)之争是个“宗教信仰问题”。
【P54|T】自然键关联业务。替代键简化键策略和业务耦合。
【P55-P56】图6.5和代码比较清晰。
【C6.7】合并列:粒度,精度,用途评估。
【C6.8】合并表:似合并列,起因为,过度设计,信息不对称。
【C6.9】移动列,起于规范或性能。确定删除,插入规则,增加新列,同步数据。
【C6.10】列改名,可读性,移植性。
【C6.11】表改名:RENAME+VIEW 或 新旧表+同步。
【C6.12】视图改名:基于新视图重建旧视图。
【C6.13】用表取代大对象(LOB):元数据拆分,如住址分省市区。
【C6.14】取代普通列:类型变化等。
【C6.15】关系表取代一对多关系:过渡到多对多,但增加连接数,影响性能。
【C6.16】自然键取代替代键:减少开销,统一键策略,删除不必要键。
【C6.17】拆分列:细粒度化,避免多用途列。
【C6.18】拆分表(垂直拆分):性能改进,1NF要求,安全控制。

9. 第七章 数据质量重构
【2010-06-07】
【C7.1】常见问题:修复约束,视图,存储过程;更新数据(行锁,表锁)。
【C7.2】增加查找列:为一个列创建一个查找表。
【C7.3】采用标准代码:统一列里的代码(code)值,保证数据库内类似列的一致。
【C7.4】采用标准类型:保证列类型与数据库内其他类似列一致。
【C7.5】统一主键策略:为一个实体选择一个键策略,并在数据库中保持一致。
【C7.6】删除列约束:过时的列约束。
【C7.7】删除缺省值:对已存在数据是否变更。
【C7.8】删除NOTNULL约束:是否可用缺省值。
【C7.9】引入列约束:有效性检查。
【C7.10】引入通用格式:对表内已有数据采用一致的格式。
【C7.11】引入缺省值:参考C7.12
【C7.12】使列不可空:改变已有列,使其 NOT NULL
【C7.13】移动数据:所有列或部分列的数据移动另外一个表。
【C7.14】用属性标识取代类型代码:滥表达,貌似是Value变Code。

10. 第八章 参照完整性重构
【C8.1】增加外键约束:强制实现到另一个表的关系。
【C8.1|T】外键约束降低了DB性能,每更新是会对另一个表进行验证,索引。
【P129|B】立即检查-注意顺序/延迟检查-提交事务时。
【C8.2】为计算列增加触发器:是应用程序完成,还是数据库完成(有效更新)。
【C8.3】删除外键约束:性能和质量折衷,可以DISABLE外键,保持关系但不检查。
【C8.4】引入层叠删除:CASCADE是级联删除!!外行翻译。
【C8.5】引入硬删除:记录标记为删除(软)和真正删除记录(硬)
【C8.6】引入软删除:列标记,标识删除,叫做软删除或逻辑删除。
【C8.7】为历史数据引入触发器:为保存历史数据或审计的目的。LOG*表。

11. 第九章 架构重构
【C9】改变外部程序与DB交互的方式。
【C9.1】增加CRUD方法:增查改删。但存储过程,函数,触发器,依赖厂商不易移植。
【C9.2】增加镜像表:精确复制另一个数据库中的已有表。远程变本地,同步策略。
【C9.3】增加读取方法:参考 C9.1。
【C9.4】用视图封装表:实现外观(Facade)或安全访问(SAC)。DB视图和表的支持。
【C9.5】引入计算方法:通常是存储函数。可改进应用性能,取代计算列,统一算法。
【C9.6】增加索引:索引(唯一或非唯一)。改善查询性能,但修改性能下降。
【C9.7】引入只读表:只读。
【C9.8】从数据库中移除方法:存储过程,函数,触发器挪到应用程序中。
【C9.9】将方法移至数据库:反C9.8。
【C9.10】用视图取代方法:基于原有的DB方法(存储过程...)创建视图。
【C9.11】用方法取代视图:反 C9.10。
【C9.12】使用正式数据源:多源时,用最official的数据源。

12. 第十章 方法重构
【C10】"Refactoring重构"一书,把程序代码重构引入到DB的方法重构。
【C10.1】接口变更重构。
【C10.1.1】增加参数。
【C10.1.2】方法参数化:合并多个方法变成参数控制行为。
【C10.1.3】删除参数:过时的,不正确的,容易误用的,Cut之。
【C10.1.4】方法改名:名之。
【C10.1.5】参数重排序:按靠谱的顺序排列。
【C10.1.6】用明确的方法取代参数:参数多到混乱时。
【C10.2】内部重构,改进方法实现的质量,保持接口和行为不变。
【C10.2.1】合并条件表达式:if if 变 and or。
【C10.2.2】分解条件:方法调用代替条件判断。
【C10.2.3】提取方法:代码片段变方法。
【C10.2.4】引入变量:命名好复杂表达式的各项式。
【C10.2.5】删除控制标记:各种flag。
【C10.2.6】消除中间人:间接调用变直接。
【C10.2.7】参数改名:间接调用变直接。
【C10.2.8】用表查找取代文字常量:重构中取代魔数和符号常量的数据库版本。
【C10.2.9】用条件短语取代嵌套条件:IF-IF-IF变成 IF-END,IF-END。
【C10.2.10】拆分临时变量:多功能临时变量。
【C10.2.11】替换算法。

13. 第十一章 转换
【C11】为Schema增加新特性,改变语义。
【C11.1】插入数据:在原表中插入数据。
【C11.2】引入新列:在原表中引入新列。
【C11.3】引入新表:略。
【C11.4】引入视图:基于原有表建视图。
【C11.5】更新数据:╮(╯▽╰)╭。

14. 附录和词汇表
【P203】UML表示法。统一交流方式,小有用途。
【P207】词汇表。装X必备,译者基本上没在文中列出使用位置。

分享到:
评论

相关推荐

    《重构》----学习笔记

    重构的益处多样,包括改善软件设计,使代码更易于阅读和理解,帮助定位和修复bug,以及提高编程效率。重构应该成为开发过程中的常态,特别是在添加新功能、修复错误或代码审查时,都是进行重构的好时机。当发现代码...

    c++读书笔记程序以及源码

    总之,这个C++读书笔记程序及源码资源为学习者提供了宝贵的实践材料,通过阅读和理解源码,不仅可以深化对C++语言的理解,还能掌握数据库和界面编程的核心技能。同时,它还提醒我们,理论知识与实际项目相结合是提升...

    编程笔记文案

    在编程世界中,知识点的积累和理解是提升技能的关键。这份名为“编程笔记文案”的压缩包文件,无疑是一...通过阅读和理解这些笔记,你可以巩固已有的知识,学习新的技能,并逐步形成自己的编程思维和解决问题的方法论。

    spring6.0学习笔记

    通过阅读《spring6.0学习笔记.md》这份文档,开发者可以系统地了解这些新特性和变化,逐步掌握Spring 6.0的核心技术,提升自己的开发技能。文档中应该会详细解析每个知识点的应用场景、使用方法以及最佳实践,帮助...

    【Python精品资源】Python超详细笔记源码,拿到它你不会失望的

    - 数据库操作:Python有多种数据库接口,如SQLite、MySQL、PostgreSQL等,通常使用ORM(Object-Relational Mapping)工具如SQLAlchemy简化操作。 4. **Python软件/插件**: - 安装与管理:使用pip工具安装和管理...

    web笔记两连发

    3. **源码分析**:博客可能涉及了对Web应用或JavaBean源代码的详细解读,这可能涵盖了设计模式、异常处理、性能优化、代码重构等方面,帮助读者理解代码的执行流程和内部机制。 4. **开发工具**:标签中的"工具...

    reading-notes:201读书笔记

    在本压缩包“reading-notes:201读书笔记”中,Allee分享了他在Codefellows课程中的学习心得,这是一系列关于软件开发的深度学习资料。Codefellows是一个知名的编程教育机构,提供了不同级别的课程,帮助学员从基础到...

    Eclipse编程技术与实例,Eclipse编程技术与实例,StudentSystem,booksystem,Eclipse调试方法入门,Eclipse学习笔记

    首先,"Eclipse编程技术与实例"这部分内容可能涵盖了Eclipse的基础操作,如创建项目、编写代码、编译与运行、重构等。编程技术可能包括了插件开发、工作流定制,以及如何利用Eclipse的特性提高开发效率,例如使用...

    appfuse 学习笔记

    AppFuse 是一个开源项目,旨在加速和简化J2EE应用程序的开发流程。由Matt Raible设计,它作为一...通过深入阅读和实践AppFuse的学习笔记,开发者可以逐步掌握其核心功能,并将其应用到实际项目中,提升开发质量和效率。

    笔记:各种生活技巧,开明秘密和开发者笔记

    对于开发者来说,笔记可能涵盖了一些特定的技术主题,如版本控制(Git)、调试技巧、代码重构、测试自动化以及性能优化。此外,可能还讨论了Web开发框架(如React、Vue或Angular)、后端技术(Node.js、Django、...

    science 文件阅读指南

    2. **记录笔记**:在阅读过程中记录重要的观点、数据或疑问,有助于后续的复习和思考。 3. **批判性思维**:不要盲目接受作者的观点,要保持批判性的态度,分析其论证过程的有效性。 4. **利用辅助工具**:利用文献...

    oracle 优化

    这可能包括重构查询以减少全表扫描,使用更精确的JOIN条件,避免在WHERE子句中使用函数,或者利用绑定变量来减少解析次数。对于复杂的查询,可以考虑使用EXPLAIN PLAN来分析执行计划,理解数据库如何处理SQL,从而...

    reading-notes:阅读CodeFellows课程的笔记

    7. **设计模式与重构**:掌握常见的设计模式,如工厂模式、观察者模式等,学习代码重构技巧,提升代码可读性和可维护性。 8. **项目管理**:了解敏捷开发方法,如Scrum和Kanban,以及项目规划和团队协作技巧。 ...

    阅读注意事项

    代码301阅读笔记 关于本课程所有当前和将来课程的网站 读# 阅读标题/链接 课01 SMACSS和响应式Web设计/ 第02类 jQuery,事件和DOM / 03年级 Flexbox和模板/ 04级 响应式网页设计和正则表达式/ 05级 Heroku部署/ ...

    技术图书。001需要的不多。。技术图书。

    - **笔记整理**:在阅读过程中做好笔记,整理出重点和难点,有助于复习和回顾。 - **交流讨论**:加入相关的社群或论坛,与其他读者交流心得,解决疑惑。 ### 技术图书推荐 1. **编程基础**: - 《代码大全》:...

    301-Reading-Notes

    代码301阅读笔记 在这里,您将找到有关代码301:中间软件开发的注释。 随时为此添加书签,以随时关注我的Notes更新。 表中的内容 读数字 阅读标题 阅读链接 01 SMACSS和响应式网页设计 02 jQuery,事件和DOM 03 ...

    关于PD的Report Template PD_Blueprint_v13

    - **逆向工程**:对于已有系统的重构和维护,PowerDesigner能够通过逆向工程技术从现有的应用程序或数据库中提取模型,从而快速理解和更新系统。 #### 二、PowerDesigner Report Writer及其作用 PowerDesigner中的...

    opms go pycharm mysql 学习.zip

    在“kwan1117”这个文件中,可能包含了具体的代码示例、教程文档、笔记或者数据库脚本。为了深入学习,你需要解压文件,阅读其中的文档,实践代码示例,并尝试自己动手实现一些功能。同时,结合网上的资源和教程,...

    zend framework教程.zip

    通过阅读“传智播客PHP培训 Zend Framework教程 ppt 笔记 图解”,您可以逐步掌握 Zend Framework 的各项技能,从基础到进阶,全方位提升您的PHP开发能力。在实践中不断探索,你会发现 Zend Framework 不仅是一个...

    10套最新实用的小程序源码

    5. **云笔记**:云笔记源码可能包含笔记创建、编辑、分类、搜索等功能。开发者需要理解本地存储、云同步、Markdown语法解析等技术。 6. **重邮**:这个名称可能暗示是邮政服务或邮件服务的小程序,涉及邮件收发、...

Global site tag (gtag.js) - Google Analytics