最近逛书店发现一本数据建模的好书——《数据建模:分析与设计的工具和技巧》(Data Modeler's Workbench:Tools and Techniques for Analysis and Design),作者Steve Hoberman。粗读完一遍后,感觉这本书的确无愧于译者和国外专家们的盛赞:“这本书充满了对改进数据模型和设计有益的技术和技巧,并且它还极富阅读乐趣——一个了不起的结合!任何一个数据建模者都应该拥有一本Steve Hoberman的关于数据建模工具和技术的书。”4 P! c2 `" u, N4 `/ h4 P0 `$ a h; ]
% d/ K/ q, w. ` Q, V+ R3 k
尽管我对自己所掌握的数据建模知识有一定的自负,读完该书后,还是获益良多。本着好书大家一起分享的想法,我把该书的每个章节的总结和技巧建议列出来,以方便手头暂时没有该书的朋友在数据建模时参考。该书所介绍的工具和模版可在作者的Web站点下载,地址是: 6 Z; s3 M0 D- j$ x W, f www.wiley.com/compbooks/hoberman 7 e' k& E6 x* ]. I2 w+ e* e & h- K0 T3 P+ b& \2 j 第一章:使用趣闻、类比和演示文稿来阐明数据建模的概念" G- o+ q6 N7 h: w, g! n
1 I9 d" p$ E$ M; }# Z 在一般的日常沟通中。我们可能会说出并听到许多故事、或者趣闻这些故事涉及的论题范围很大。有些例子是周末发生在我们自己身边的事情,或者是与我们的工作项目有关的经历。这些趣闻有助于加强我们和周围人们的关系,增进我们的愉悦情绪,而且对我们有教育作用。我们能够把由语言表达出来的东西形象化。有时,当故事结束时,给我们留下的是以前未曾想到的信息或更多的认识。在解释数据建模概念时,趣闻是极其有效的。原因有如下几个:- Y) \7 G8 \- o7 S! z
它们建立起持久的形象。8 I' L K3 _1 M) M2 } r! z+ O
它们引人入胜、使人愉悦。# j) _: \ h2 k3 s
它们增经人们之间的关系。 + y) v) ], Y( y- }; k( G& \ 它们减缓压力。 2 @* w& S* W* S( Z& x" M2 }. G. P) ]. ^
成功编造并讲述一个数据建模方面的趣闻有下面三个简单的步骤: 3 T, Y. \; c, W 1)定义一个论题。要在心中保证,你讲述的这个趣闻有一个特定的目标或论题,也就是说,这个故事是为了解释一个数据建模的概念或术语。( L9 g2 y3 r" V2 T
2)选择你的故事。我们可以选择的故事类型多种多样。我们要考虑选择一个有趣并有益,而且能够明白无误地传达主题意图的简短的故事。; }% y4 _8 u* H& ]# o- A
3)演练你的故事。一旦找到了合适的故事,你要好好演练一番,直到你自信它能够在两分钟的时间内充分表达你的论题。要避免讲述拖拖拉拉的故事。% O( {& e; A m: d
9 S/ E u, m9 Y% H% ~# D
数据模型类比2 i. Z3 j, ]1 U/ ~% ^
类比就是把两个或多个概念进行相互比较,以强调它们之间的相似或差异。类比是介绍外来事物或新鲜事物的一个很好的技巧,尤其是向非计算机专业的人士介绍计算机的专业知识时。Hoberman在数据建模中最常见的几个类比如下(他用这些类比轻松的打动管理层给他涨了一倍的工资^_^): 1 V( B' v" P: v+ X' J0 Q& P, } 主体域模型是一个居高临下的视点。- J/ `. S: v" D9 q$ H! x
数据模型是一个设计图。 " z% t( I2 o" n+ Q. r8 n! K 企业模型是一个世界地图。 " k0 B2 w" p/ h/ z 标准就是城市规划。 7 X: z. V- u2 r- d# e 元数据仓储库是一个图书馆。 / p* E% ^) I+ S) U2 L/ @0 n1 ` 数据仓库是“心脏”。6 E D5 c6 H7 w9 P/ J# X& H
6 G$ Y+ j% O! I- \3 f' S1 c9 L 第二章:元数据宾果游戏+ G6 y/ C; g# Q8 ~3 Z/ ~
简单来说,即通过宾果卡片游戏的方式,调动项目团队成员的积极性,来确定数据模型,并确定元数据的有效性。元数据宾果游戏强调“共赢”,如果运气好,游戏结束时每个人都能赢。. V; g- d' D( M H% Z+ S# s1 r
2 k# ?6 o' w6 F: @5 ] 第三章:确保高质量的定义% N ^3 m: A! Q1 r3 `6 k7 d+ |3 \
本章集中讨论一个被称为“定义检查单”(Definition Checklist)的工具,它包含了确保定义的质量处于最高水平的准则。 + ?3 e: w/ H- U( U, F E( L& F' r) L# u* T! |
第四章:数据建模者的项目计划 & |! U/ t- g2 Y& H8 c' g 本章重点介绍确定数据建模阶段、任务、工具和时限的四个工具: + j: r Q, i5 q3 ?7 B/ | ·数据建模阶段的工具:用来确定最高层次上的数据建模步骤。# A. @1 @( y) y9 B+ P! Z; G6 b
·阶段—任务—工具:提取出“数据建模阶段”的各个阶段并把他们分解成数据建模任务。 + T* U, T! a& R3 i* h ·优先级三角形:你可以从以下三项中取两项极值:很高的质量、最短的时间与最低的成本,但你永远也别想三者兼得。 $ f3 W2 Y* |' I! P8 R% I* l ·可靠的估算工具:“主体域工作量时限”根据应用程序的类型,确定每个数据建模阶段应占整个项目的百分比。“任务工作量工具”提取在“阶段—任务—工具”中确定的每项任务,并列出它们应占整个数据建模工作产品的百分比。这两个工具的组合可使你向项目经理提供一份具有一定精确度的合理估算。& c" p( K1 `& V3 e, C5 n2 p5 }
- e! E" H0 |: @/ r$ [- b8 J 第五章:主体域分析9 u7 u N( J8 f" e( @# e2 E
本章主要探讨五个关键的工具,这五个工具对数据建模工作的主体域分析阶段有帮组作用。它们应该按照下面的顺序被逐个完成: 5 B1 a1 T* a, H* l 1)主体域检查单:新应用程序中的主体域的完整列表,还有各个主体域的定义和同义词(或别名)。$ E) T( ^: r: |1 i- O+ r6 a2 I
2)主体域CRUD(Create Read Update Delete)矩阵:包含新应用程序和现有应用程序之间的主体域方面的差别和重复之处,确定应用程序的范围。 $ z4 Z9 Z* v9 F* w0 S3 Z2 S, O 3)In-the-Know模版:确定完成这个新应用程序的数据间模工作产品所需要的、被用作资源的人员和文档。 - k6 C$ j& w/ k6 n 4)主体域家族树:包含每一个主体域的源应用程序和若干其他的关键信息,阐明主体域数据将来自哪里。 2 d: h: h t/ \2 k 5)主体域力度矩阵:使用一个电子表格的格式,记录每一个度量和事实主体域的发布层次。& M6 E' d0 [' y9 u/ x: T9 U
3 }; J2 ^$ W f9 T O) w! W. m
第六章:主体域建模4 N8 p. _6 y; c- G
本章阐述三个队主体域信息进行建模的强大工具: & m* l1 e- m2 [9 n% r- s ·“业务清理板”模型。+ D7 Z( Q1 f4 d
·“应用程序清理板”模型。 ( |* g T. ]4 G, V+ k ·“早期现实性检查”模型。 - N: r: H" f5 |1 c! f; e( i4 K# A$ w1 G, ]- ^7 I/ C8 y8 o
第七章:逻辑数据分析 3 p' T: u. B3 k0 C m: E2 }; h5 @ 本章关注四个逻辑数据分析工具,它们应该按照下面的次序被使用:- @0 m$ s- E. V( _' R# Q$ o
1)数据元素家族树:包含应用程序的数据元素的完整列表,以及每个数据元素的来源和变换信息,还有其他几个关键的数据元素元数据。! U0 r9 _% W; ]
2)数据元素粒度矩阵:用一个电子表格的格式,来记录每个度量和事实的发布层次。 ; c$ n1 C5 z; q0 g: q1 d/ t1 v) J" r 3)数据质量记录模板:展示每个数据元素的员数据和一些实际数据的对比。9 J. J6 S, j& ^+ _, f2 ~5 y! q
4)数据质量确认模板:记录每个数据元素的元数据和一些实际数据的对比的结果。 * K7 }6 _5 I: e, h0 U5 V( N. a) q1 q, K+ V9 Z+ }; ]! u0 z
第八章:规范化之旅和反向规范化生存指南(强烈推荐:是我目前所读过最好的关系型数据库的规范化技术文档) 9 L/ d! v- X% [ 规范化是一个剔除冗余并应用规则的过程,它的目的是为了更好的理解和表达存在于数据元素之间的依赖性和参与性。规范化包含6个层次,最高层是第五范式(5NF)。一般的技术文档上都认为达到3NF即可,Steve Hoberman给我们指明了更高的目标:5NF。Graeme Simsion写过一本名为《Data Modeling Essentials》的书,在这本书中,他写道:“较高层次的范式常被从业者误解并因此而被忽视,或为了支持不可靠的建模时间而被引用。”但是,我们需要理解这些较高层次的规范化,因为它们体现了额外的规范化机会,并帮组我们进一步减少冗余信息、改进设计的灵活性。尽管余下的三个规范化层次有可能仅仅产生次数很少的变化,但它们仍然具有一些提高灵活性和效率的机会。下面是BCNF&4NF&5NF的定义(比国内教材上罗列的数学公式容易理解得多^_^): - F. J3 B& L6 X" [* k2 s, g$ P d4 i BCNF=3NF+下面的规则: , z" v. l4 r0 \; b" b& T 每一个数据元素都完全依赖于键、整个键,而且除依赖于这个键以外,不依赖于任何其他数据元素。 $ i9 R( a3 z- ^ 4NF=3NF+下面的规则: . j- @2 d2 _8 ~6 V; R 要把主键中拥有三个或更多外建数据元素、切割格外键之间不存在约束的那些实体分解成两个或更多个实体。6 M$ F J8 w+ }% N, h; k
5NF=4NF+下面的规则:& ^" L. `* o% r; l+ L
把主键中拥有三个或更多的外键数据元素,且这些外键数据元素之间存在着约束的实体分解成为所有的约束都需要的多对多的关系。2 i6 P2 i! F% U% u0 ~ |
$ ? Y. `$ k) o; ~% o/ d( O1 q
当我们攀上5NF的顶峰后,再根据实际需求情况来进行“反向规范化”增加数据冗余,从而简化开发,提高查询速度。反向规范化是这样一个过程:在定义了一个可靠的、完全规范化了的数据结构之后,你借助这个过程,有选择地引入一些重复的数据,以促进特殊性能需求的实现。Steve Hoberman的“反向规范化生存指南”给如何适当增加冗余提供了一套可计算的评分标准。通过考察每个关系的6个问题,累加各个问题的得分之后,当得分大于等于10时,我们将对该关系进行反向规范化。+ ]. P/ p! B" ~0 @: [
$ E& j& E, j5 F+ U' x+ g8 K
“反向规范化生存指南”的计分规则:" C1 d3 G" u$ Q) B; k: f7 z
1.关系是什么类型的:该问题确定我们所分析的关系的类型。父实体对于子实体具有什么样的关系?; }1 l8 A# K& }( P# q( l# o6 L+ M7 p
层次关系(20分) 8 `6 S" z( j5 e 同等关系(-10分) ' ~* Z0 d/ s" v$ ^9 i! x 确定关系(-20分) + C7 ^* w g2 B- f j 2.参与率是多少:该问题确定一个关系中的每个实体的参与性。换句话说,对于一个给定的父实体数值,大概会有几个子实体数值?父与子的关系越接近“一对一”,我们对它进行反向规范化的机会就越大。 # N/ a- l+ Q: W, C0 z 多达“一对五”的比率(20分)4 @; Z8 M- J) Q& ]0 z
多达“一对一百”的比率(-10分) 9 P5 p" Z5 ~' [6 i 超过“一对一百”的比率(-20分); S* U9 m! v! E- O8 D. A
3.父实体中有多少个数据元素, R" c3 j# T" k8 P7 Y
少于10个数据元素(20分) 3 P$ `- D: l9 Q, A 数据元素的数量介于10到20之间(-10分)* A4 ]8 K1 U9 ?3 r4 }0 I8 R' D
多于20个数据元素(-20分)8 m Y; L- |1 s1 e/ j
4.使用率是多少:当用户需要来自子的信息时,通常情况下,它们是否还需要来自父的信息呢?换句话说,这两个实体的耦合或相关程度如何? 8 m9 f* J( L1 }; V5 { 相互之间的关联很强(30分)9 e& Q( x M! w2 ~
相互之间的关联较弱或者没有关联(-30分) 1 R+ p3 y+ q$ N 5.父实体时一个占位符吗:在不远的将来,我们是否还打算向父实体加入更多的数据元素或关系?如果答案是“不”,那么进行反向规范化的可行性就更强。 * P/ Y- W: b i 是(20分) ! {: e; e% o& E, n2 i5 m3 q 不(-20分)3 r, G4 f) G4 f: k+ b9 _: i0 }
6.变动对比率是多少:该问题是为了确定,在同一时间周期内,两个实体的插入和更新的频度是否相近。如果其中一个实体很少变化,而另一个实体却变动频繁,那么,我们就非常倾向于保持它们的规范化状态,把它们放在各自的表中。* D* p" j1 }$ x6 s! M# n# U) a
相同(20分) , f" f8 g9 b# G6 }- ^ 不同(-20分)- S& n) N- `, d! L! r* V, S- c) W
5 P: T9 |, {9 |* j, X
“反向规范化生存指南”的使用方法: # G0 r8 ^! n5 U& s# S# t% d" K 1)把模型中的关系按照优先级排序( z, o+ v. I% H3 d. {8 r1 L
2)选择一个关系" ^, s0 Y: {# Y& ~! h& ~+ ?
3)对这个关系回答提问 : \; P7 H* t( D0 w3 U& j 4)如果得分等于或大于10,就进行反向规范化 w& t G6 k$ ~% u9 ~4 N" s; ~4 a( B; n 5)返回步骤二,直到完成所有的关系。 6 q& c/ y6 o- d: k% `' P5 U# J( q# N; c) }) s4 o7 e' r
第九章:抽象化安全指南和组件 2 _! R, ~1 I7 Y' S5 G- o 看过我的“浅谈数据库设计技巧(上) ”的朋友应该还记得我举的第二个例子:网上电子商务平台上的商品信息表的设计。本章将我在上面例子中所用的方法上升到了理论阶段,采用了面向对象的设计,将所有商品的共有属性提取出来,抽象成一个超类,再加入一个表来记录各个不同实体之间的细节来实现超类的派生,从而实现设计的灵活性。当出现下面两种条件的任何场合,抽象化都是极其有用的: : x/ d; o% ?: C1 W 设计需要永久维持下去:要求以后尽可能的不修改数据库设计1 b) X f& {8 y E5 \' _6 s* e9 k
需求可能发生变化:应用程序的需求发生变化,而要求业务流程重组或进行功能升级 M# b' o* l/ H5 ^; |
数据仓库:当新的分类类型从源应用程序中传过来时,我们无须对数据仓库的设计进行任何改动,而只需在分类类型实体加入一个新行即可3 |/ S3 @; |0 W4 h1 t3 J/ l' C" m
元数据仓储库:和数据仓库的要求类似8 L5 z9 \2 E7 W9 w
! W1 S' e ~; d0 J# r- b 当然,抽象化会大大增加工作量和开发的复杂度,而人们通常关注的是非常短期的应用和眼前的成本,而不关心将来的高得多的成本。所以,我非常赞同敏捷软件开发这个观点:在最初几乎不进行预先设计,但是一旦需求发生变化,此时作为一名追求卓越的程序员,应该从头审查整个架构设计,在此次修改中设计出能够满足日后类似修改的系统架构。 6 W8 k# x6 L! N' c* _- B) G9 S: `! |) w! U6 a+ L. S h/ o' w! L; ?; f/ u
“抽象组件”就是小型的抽象模型片段,在许多的建模场合(无论是什么行业、组织,甚至什么主体域的建模场合)中,它们都可被反复使用。在键模阶段多次使用抽象化之后,你将开始看到出现的抽象化结构的趋势。这些“抽象组件”有如下的目的:, g) v7 {$ H- K5 T H# R0 p! l7 S
加快设计速度 R) H x# A+ _/ c, l+ D* M8 j 加快开发速度 ) U$ k6 B: J- B8 ~( m 提供通用且有用的机构. N/ `' F% d; q" h& V- U* g' O
- C4 R% c* C3 r1 X" |: y) K 第十章:数据模型美化技巧9 D, U- T+ Y' J* u. {! ~4 K7 t0 J
本章通过关注如何改进逻辑和物理数据模型的视觉外观,使我们的设计超越直接的应用程序需求。本章中讨论了五个类别的美化技巧:* j9 `- ?+ i! O5 P# u2 n
逻辑数据元素排列技巧:这些技巧是一个推荐的、对你的逻辑数据模型中的每一个实体的数据元素进行排序的方法。8 P- h/ H' n$ R" t2 t
物理数据元素排序技巧:这些技巧关注数据模型中每一个实体的最佳布局。 0 ]/ p. l7 J/ F) T 实体布局技巧:这些技巧关注数据模型中的每一个实体的最佳布局) t; h# Z; D0 N' N# A4 f, p$ K. S5 d: Q
关系布局技巧:这些技巧关注如何调整重叠的关系线条以及看起来穿越(而不是绕过)无关实体的关系 2 t- B4 S$ K% `4 l 吸引注意力的技巧:这些技巧关注如何在我们的涉及中突出的某些元素、实体或关系。 ( M% A/ [) X% l0 x1 Q6 k x/ u$ W; A2 b7 p+ k& w" j& D6 l6 o! Z( m
第十一章:规划一个长盛不衰的数据建模生涯; g! c$ \6 [3 W4 k0 G
对数据建模者的十大忠告清单: " j& d5 d$ n. ~0 e, D 1)记住:灵活性、准确性和背景/ J; I8 @5 @( l' _* v C5 Z5 [
2)建模只是你的工作的一小部分 ; d2 s+ r. f( v$ _) L5 A$ Z s* h 3)尝试其他角色5 W- u7 k5 p) z2 N, e) V
4)了解95/5规则:95%的时间将花费在5%的数据元素上; U2 x/ }5 q+ @1 @; D
5)数据建模从不令人厌烦:如果你一直在做数据建模工作,而且发现自己经常感到厌烦,那么,你的确该改变一下了。这可能不是数据建模领域本身令人厌烦,而是你所在的特定的任务、公司或行业不再令人兴奋。冒险一下,尝试着道一个不同的项目或行业中进行数据建模工作吧!$ w/ |. U ]. @4 U$ z" b! p+ {+ Y0 p
6)站在技术前沿 3 f: _( i% u' Z' E) q 7)尽量不要在模型上牵扯感情因素:建模者必须理解,人们在评审过程中的意见并不是针对模型的创建者,而是针对这个模型的内容。即那句老话:对事不对人。4 v l8 J5 h7 U$ C: ~0 N7 I# w
8)让你的创造力展开翅膀:在考虑记录数据需求和改进设计的新方法时,要紧可能有创造性。有创造性也许就意味着修改本书中的某些工具。这还可能意味着提出你自己的电子表格或其他工具。 + p: Y# h" m6 L/ R% L. ~0 d 9)单纯的理论太昂贵了:在设计活动过程中,你要确保把这个观点牢记在心。为这个应用程序掏腰包的部门和组织期望看到的是能看得着的实用结果。 * c- e8 T/ v6 R 10)成为一个了不起的会讲故事的人:作为一名数据建模者,讲故事是工作的一个很重要的部分。为了帮组教化和影响项目经理以及对我们行业缺乏理解的其他人,我们需要讲故事或趣闻。 " z2 P( r# Q" }% e, `8 T& A7 d7 b. f, o# D, T, P9 a
最后,我个人觉得,Steve Hoberman所提出的“抽象组件”的观念和面向对象设计中的的“设计模式”非常类似。即数据库专家在多次的数据建模后,将各个项目中的类似部分抽象化,提取出特定的建模模型片段,以后只需在新的项目中对这些模型片段细化派生,即可快速构建出适合于该项目的数据库架构。不过,这些建模模型片段并没有统一,形成标准,目前也没有出版这类的书籍。本人正在陆续总结自己在这方面的经验,但是自知水平有限,不敢在高人面前班门弄斧,只希望自己日后陆续发布的相关文章能起到抛转引玉的作用,争取由中国的程序员率先统一出数据建模领域的“设计模式”。