: F N" J% F9 p, ` 这一部分罗列了 12 个基本技巧,包括命名规范和明确业务需求0 B( N% _0 ]- `$ m s( {1 I
等。 x# q$ I' z0 R! E# D* r- v; n, D1 A+ O p1 t
第 2 部分 - 设计数据库表% r3 d/ D- l9 }) ?8 a$ A
% s& d( r& W0 `, }) |& n: z' S
总共 24 个指南性技巧,涵盖表内字段设计以及应该避免的常见$ i/ o6 x0 I) y6 ?6 a
问题等。 W7 \0 H4 H) i; _3 F- j1 ]7 r" C# k. J9 K$ q4 T
第 3 部分 - 选择键$ |% O2 x+ z, U: I# {
9 t8 Y: B* K% c+ U
怎么选择键呢?这里有 10 个技巧专门涉及系统生成的主键的正, R6 ^4 c7 y$ i" X5 C8 R
确用法,还有何时以及如何索引字段以获得最佳性能等。( p4 g/ D/ K0 o/ {9 Y. } ]
7 K3 U6 [/ c2 D
第 4 部分 - 保证数据完整性 4 Q3 P, Y: X `1 l6 D: s) ?8 |6 `+ N- C- ~0 V8 J- Q
讨论如何保持数据库的清晰和健壮,如何把有害数据降低到最小 5 D7 V. B( r% U1 b 程度。, I( N* @. p2 i1 o/ |4 k, Y2 {. v
. f& c- ?0 r* ~" \ 第 5 部分 - 各种小技巧8 B2 O, i0 S, t4 J
0 n) t- c0 A# B9 l0 ]0 G
不包括在以上 4 个部分中的其他技巧,五花八门,有了它们希& w" F1 L% i2 I6 E! s
望你的数据库开发工作会更轻松一些。6 \+ _1 i% q( t% X2 T
s6 L3 J! }* v" |3 X* d. P0 g( Z & M/ J2 e2 [ }- P § 第 1 部分 - 设计数据库之前! ^* F# S2 q' X. O. c
────────────── # x8 C* w9 P+ K m$ |4 ~+ a& h ; U5 T2 o5 F/ D; V# a9 [" u ■ 考察现有环境2 g- u/ K$ t; z/ y( |( ^8 J
: G5 R7 H5 o4 o
在设计一个新数据库时,你不但应该仔细研究业务需求而且还要 " [9 }/ q, E: m 考察现有的系统。大多数数据库项目都不是从头开始建立的;通常,% _& r5 `* o3 ~* \$ f& H, D) ~
机构内总会存在用来满足特定需求的现有系统(可能没有实现自动计 ; }" J$ o/ g! p. \+ i& N" F8 I; f 算)。显然,现有系统并不完美,否则你就不必再建立新系统了。 + U7 l6 Z! E0 A6 s S( D6 M. R6 Z / \6 w/ c8 _; l5 x5 L# \: X 但是对旧系统的研究可以让你发现一些可能会忽略的细微问题。 $ f/ T5 E& ]6 d5 ]' m 一般来说,考察现有系统对你绝对有好处。# }( L+ @ C' d* b8 H" H5 C
+ P& `& ]4 x; w2 l0 }
■ 定义标准的对象命名规范 6 H' r5 i+ Z x" x, j ! o& {4 |" l6 P! C2 I; j 一定要定义数据库对象的命名规范。对数据库表来说,从项目一 6 F) d5 u8 N; E 开始就要确定表名是采用复数还是单数形式。此外还要给表的别名定7 v- J) `) l7 ]" E
义简单规则(比方说,如果表名是一个单词,别名就取单词的前 4 0 a1 e& ?* I* \6 o
个字母;如果表名是两个单词,就各取两个单词的前两个字母组成 7 J, G s* ~8 z* K' K* Q$ C- L
4 个字母长的别名;如果表的名字由 3 个单词组成,你不妨从头两 7 W N2 x* b3 F# [ 个单词中各取一个然后从最后一个单词中再取出两个字母,结果还是 O" D" Y+ @# R7 c5 H 组成 4 字母长的别名,其余依次类推)对工作用表来说,表名可以7 P: E, Z+ w1 Z
加上前缀 WORK_ 后面附上采用该表的应用程序的名字。表内的列[ 3 D+ t' O8 \4 l9 n
字段]要针对键采用一整套设计规则。比如,如果键是数字类型,你 2 X) S5 j8 W6 E1 m 可以用 _N 作为后缀;" b, `/ o/ m$ `& o) G
' d( g% h% L2 t: j+ T f
如果是字符类型则可以采用 _C 后缀。对列[字段]名应该采用标 2 h9 B. _' Y7 T$ ~# P 准的前缀和后缀。再如,假如你的表里有好多“money”字段,你不 / q, Q0 J% o" n9 I, w7 p- B7 C 妨给每个列[字段]增加一个 _M 后缀。还有,日期列[字段]最好以 , z! Y, U$ u/ k B( h h6 I
D_ 作为名字打头。 # T1 `/ l% r: I& {' P2 O, [! k! v$ s- B5 w" I3 X
检查表名、报表名和查询名之间的命名规范。你可能会很快就被 - i' C0 N$ s. C 这些不同的数据库要素的名称搞糊涂了。假如你坚持统一地命名这些 / @; H3 _8 x# ?; T9 L+ a 数据库的不同组成部分,至少你应该在这些对象名字的开头用 ! t( t/ u1 E! z) }" z$ a# B8 u
Table、Query 或者 Report 等前缀加以区别。* i$ c' A& r& B# E, f8 @* G U# |
: {6 f* i3 ^% \( c/ D6 l* U3 O4 m 如果采用了 Microsoft Access,你可以用 qry、rpt、tbl 和 ; G1 k2 H2 k: X% T5 l' O q5 d
mod 等符号来标识对象(比如 tbl_Employees)。我在和 SQL . W+ \- K' ~2 X2 J: Z# i8 H Server 打交道的时候还用过 tbl 来索引表,但我用 sp_company T0 S! `1 S1 a3 O (现在用 sp_feft_)标识存储过程,因为在有的时候如果我发现了 - @+ s2 w: r* T# T N 更好的处理办法往往会保存好几个拷贝。我在实现 SQL Server ' j& b+ a: U( A8 B6 r: M6 ?) i8 u 2000 时用 udf_ (或者类似的标记)标识我编写的函数。 0 B I# R, }8 F6 d4 D) P! v8 O
工欲善其事, 必先利其器采用理想的数据库设计工具,比如:6 [* G+ w& @0 t, [
SyBase 公司的 PowerDesign,她支持 PB、VB、Delp he 等语言,通2 o6 e" W5 n8 V5 ]- c( d" C
过 ODBC 可以连接市面上流行的 30 多个数据库,包括 dBase、" t; o: d. l# p2 _" j! W8 {5 ^; t
FoxPro、V FP、SQL Server 等,今后有机会我将着重介绍 . e, {& A0 A- [# b7 ?, _2 R! N PowerDesign 的使用。 $ v* @ ^) n" t6 c, I' }1 A- H; s- W- o
■ 获取数据模式资源手册( M; u3 E ~! z/ |4 h) Z' Q/ E" n
& ?( j5 D1 s( N+ e 正在寻求示例模式的人可以阅读《数据模式资源手册》一书,该 5 J6 c+ @* E* P2 e6 }5 x0 e; C 书由 Len Silverston、W . H. Inmon 和 Kent Graziano 编写,是% s2 @7 Q( U, l% S. n# J
一本值得拥有的最佳数据建模图书。该书包括的章节涵盖多种数据领. a; J6 p, ^1 X1 {3 ^" a# y) {& e
域,比如人员、机构和工作效能等。其他的你还可以参考:[1]萨师 , k6 i7 o( Q& P* [' \8 H' ~0 ]: K 煊王珊著数据库系统概论(第二版)高等教育出版社 1991、[2][美] * R" D: f/ y: W: ^8 s5 b
Steven M.Bobrowsk i 著 Oracle 7 与客户/服务器计算技术从入门" w) U' h; ?$ x2 o
到精通刘建元等译电子工业出版社, 1996、[3]周中元信息系统建模 0 D8 ?2 g/ s5 x/ \2 B) [ 方法(下) 电子与信息化 1999年第3期,1999 畅想未来,但不可忘: n3 _- G& i4 c* ^8 t5 Q
了过去的教训我发现询问用户如何看待未来需求变化非常有用。这样 3 j; \; v5 P- z8 g' [3 b 做可以达到两个目的:首先,你可以清楚地了解应用设计在哪个地方 9 h& Q* J0 x U. H 应该更具灵活性以及如何避免性能瓶颈;其次,你知道发生事先没有 3 w8 g9 U# S- ~+ u4 X8 t) H" { 确定的需求变更时用户将和你一样感到吃惊。 ( w7 J! N( f( i% r% A* ~2 ^/ W/ j$ l
一定要记住过去的经验教训!我们开发人员还应该通过分享自己# R( V$ B4 Z9 w/ J! D! l
的体会和经验互相帮助。/ l6 z1 \7 H r
4 x+ N+ n1 U, w z 即使用户认为他们再也不需要什么支持了,我们也应该对他们进" B, }; G! K$ h: l- j0 ^. g
行这方面的教育,我们都曾经面临过这样的时刻“当初要是这么做了 4 n/ P! F4 ~" B1 z- x+ o 该多好..”。0 a V/ A$ y! S* J
' l3 d4 O5 a V7 Y
■ 在物理实践之前进行逻辑设计0 x. r; b% ]- q5 J$ E3 v% H
5 E m$ b5 J1 F' o1 U) B 在深入物理设计之前要先进行逻辑设计。随着大量的 CASE 工具 - g, S+ r6 R% F% a; z6 k4 k 不断涌现出来,你的设计也可以达到相当高的逻辑水准,你通常可以 9 `; i7 Z3 K5 \% B, v 从整体上更好地了解数据库设计所需要的方方面面。 + y, q9 @% o9 a8 f- `$ H' q) t. r5 U2 c% E9 h# g2 K
■ 了解你的业务7 \' n& E( `& w1 b, K
* {$ y7 c5 K* x9 C' r" B# l 在你百分百地确定系统从客户角度满足其需求之前不要在你的 & j; O& H) w1 |" E ^ ER(实体关系)模式中加入哪怕一个数据表(怎么,你还没有模式?) N7 g5 H2 a) q, y5 |5 h9 Y
那请你参看技巧 9)。了解你的企业业务可以在以后的开发阶段节约# i7 R: ^ }: ~' A% N
大量的时间。一旦你明确了业务需求,你就可以自己做出许多决策了。8 L! \5 z8 ]3 m2 j
m# K% N; U2 Y3 P+ z9 x) X 一旦你认为你已经明确了业务内容,你最好同客户进行一次系统- w/ |6 O6 R; T9 ]+ u# Y# ^
的交流。采用客户的术语并且向他们解释你所想到的和你所听到的。 s( q2 e* G, A# e 同时还应该用可能、将会和必须等词汇表达出系统的关系基数。这样 : s/ e: m' D& w0 U' ~( m% E$ ` z 你就可以让你的客户纠正你自己的理解然后做好下一步的 ER 设计。 . [# W: D5 Q9 o" y& O9 J ! D# o/ d3 Z" I: j2 C& [# d ■ 创建数据字典和 ER 图表/ o, s( j3 z2 O! H7 H
) V7 J: B1 L; U3 [ 一定要花点时间创建 ER 图表和数据字典。其中至少应该包含每4 x& B0 R# Z/ [0 K- C
个字段的数据类型和在每个表内的主外键。创建 ER 图表和数据字典1 `; K+ b, r/ E. B! d, ]% n0 M
确实有点费时但对其他开发人员要了解整个设计却是完全必要的。越4 E. R$ S6 {4 j! x
早创建越能有助于避免今后面临的可能混乱,从而可以让任何了解数: e$ j v" b$ X! J7 W( Y' y5 H
据库的人都明确如何从数据库中获得数据。. U$ x3 ?7 \) G2 L0 S
6 T# F& g! I2 u* q1 ? x, ~3 r
有一份诸如 ER 图表等最新文档其重要性如何强调都不过分,这 ' `( ?2 q* ~+ D* Q& s' O7 ]. t 对表明表之间关系很有用,而数据字典则说明了每个字段的用途以及# D# ]% X( ~4 X* t( K$ T0 ~
任何可能存在的别名。对 SQL 表达式的文档化来说这是完全必要的。 . y h1 S1 V" n; {4 S ) P4 Y" C, C1 B ■ 创建模式 * X6 N* T! x7 _+ v! w# ~ ' V' Z# z6 ^2 j5 t 一张图表胜过千言万语:开发人员不仅要阅读和实现它,而且还 4 O2 A, W) ^3 s# [) C( A 要用它来帮助自己和用户对话。模式有助于提高协作效能,这样在先$ G, t% n+ ?( K3 C- U- m& D6 X
期的数据库设计中几乎不可能出现大的问题。) G. U" a7 `8 b9 T! }& W4 R" ?
, P0 e" h4 c$ y 模式不必弄的很复杂;甚至可以简单到手写在一张纸上就可以了。 $ z" }" w4 n8 l1 g% Z' X7 h/ h 只是要保证其上的逻辑关系今后能产生效益。 ; w% `/ c$ `2 W% |' Z9 o' k4 \ Q( U) ^2 [
■ 从输入输出下手 / S3 D3 t# J3 x# g5 b$ C+ @: j* `. Z4 D$ p
在定义数据库表和字段需求(输入)时,首先应检查现有的或者* |7 u) R& S4 r+ M* q
已经设计出的报表、查询和视图(输出)以决定为了支持这些输出哪6 s. R0 a* Q1 E! T
些是必要的表和字段。举个简单的例子:假如客户需要一个报表按照$ O( u3 P0 ?# I
邮政编码排序、分段和求和,你要保证其中包括了单独的邮政编码字' P0 ]- |/ v6 e& p
段而不要把邮政编码糅进地址字段里。) r. [9 N( R. B) `. `
" L9 c- n" E, w9 \9 i$ [6 Z1 J
■ 报表技巧 7 c3 L0 T3 r% F% P& y3 ~% d z. S( Q ! s5 o2 T, p! P0 s 要了解用户通常是如何报告数据的:批处理还是在线提交报表? 2 u. I5 v0 h2 p$ `3 ^ 时间间隔是每天、每周、每月、每个季度还是每年?如果需要的话还 . U2 W% f5 Y j 可以考虑创建总结表。系统生成的主键在报表中很难管理。用户在具0 J1 m% @! G x r2 D; D' W0 X
有系统生成主键的表内用副键进行检索往往会返回许多重复数据。! P9 c4 N, c1 X: E0 s1 h
3 p$ h$ J' c% o+ ?' X+ d
这样的检索性能比较低而且容易引起混乱。4 E0 K, A) O0 H3 E- F) \5 J
?, Y! `7 d% @
■ 理解客户需求' e3 U# A# X1 Z s8 m/ R: ?7 @
U5 f1 Z6 D1 K3 J& [ 看起来这应该是显而易见的事,但需求就是来自客户(这里要从 5 y1 o' a) l: I 内部和外部客户的角度考虑)。不要依赖用户写下来的需求,真正的! w+ t% B# I O1 C
需求在客户的脑袋里。你要让客户解释其需求,而且随着开发的继续,' J0 Z+ _- [$ o0 E" t3 ]
还要经常询问客户保证其需求仍然在开发的目的之中。一个不变的真. A- ?% H8 ~' Y% Y: a/ x, s
理是:“只有我看见了我才知道我想要的是什么”必然会导致大量的 b- r+ |% O9 t4 n D2 C" @
返工,因为数据库没有达到客户从来没有写下来的需求标准。而更糟+ Y) ~/ S# X7 T2 Z, ~# U- T
的是你对他们需求的解释只属于你自己,而且可能是完全错误的。" l' m8 C. W R2 t# U
3 c9 n! V1 U+ B6 C5 e 2 J) V% S2 }' G" L § 第 2 部分 - 设计表和字段2 D; k9 `8 R) i% Y6 _5 f
──────────────+ J5 r/ C. o, _4 ]- {. U
- m! i( R5 p; w ■ 检查各种变化1 p$ I4 u5 B2 w
6 [/ m' o, J& `) X
我在设计数据库的时候会考虑到哪些数据字段将来可能会发生变. P T! N: N& s/ S0 @: Y0 _: ~! Q
更。比方说,姓氏就是如此(注意是西方人的姓氏,比如女性结婚后 3 y' D% }$ M6 ]2 [- M 从夫姓等)。所以,在建立系统存储客户信息时,我倾向于在单独的 I/ U3 {. X4 p* r2 O 一个数据表里存储姓氏字段,而且还附加起始日和终止日等字段,这; ]: z5 D2 U4 p6 r: E
样就可以跟踪这一数据条目的变化。' j' G: z0 O- r+ C
) N, ^4 K' L; n
■ 采用有意义的字段名 a6 F/ D2 c5 w + E, F7 w3 A" F# q8 y+ h% ^ 有一回我参加开发过一个项目,其中有从其他程序员那里继承的8 j) i/ Q5 R% t6 s8 e: y
程序,那个程序员喜欢用屏幕上显示数据指示用语命名字段,这也不% W d: B5 z; A1 v8 n. x5 }2 F& s
赖,但不幸的是,她还喜欢用一些奇怪的命名法,其命名采用了匈牙# b, q% d+ p9 W% y
利命名和控制序号的组合形式,比如 cbo1、txt2、txt2_b 等等。1 ^# D: G8 p" l3 Z4 f) p: s
?$ [& H# H% v) [ 除非你在使用只面向你的缩写字段名的系统,否则请尽可能地把5 z) ?% n: H8 q! G2 n4 ], z
字段描述的清楚些。当然,也别做过头了,比如 ; ^+ O! I8 d. G6 B8 w
Customer_Shipping_Address_Street_Line_1,虽然很富有说明性, 8 n2 R* R2 j- c, H+ L" x 但没人愿意键入这么长的名字,具体尺度就在你的把握中。 ) L3 h) t7 E9 u+ E/ I/ P3 F+ F! v3 B) ]* E9 n
■ 采用前缀命名' q: ~# I5 f7 V' O
% z! V p8 \. X+ D
如果多个表里有好多同一类型的字段(比如 FirstName),你不& C0 z" m- _( U8 v
妨用特定表的前缀(比如 CusLastName)来帮助你标识字段。 4 U) m) S( y, H! H ; A+ ?* R% F4 ] {, k 时效性数据应包括“最近更新日期/时间”字段。时间标记对查$ ?" w+ e3 |% V1 }9 T
找数据问题的原因、按日期重新处理/重载数据和清除旧数据特别有 / ~- g* {' s+ |. l% r% B 用。 y4 ~$ U4 R& G( f" ^ T2 a5 O( \$ L+ W& C Z$ J/ F+ p
■ 标准化和数据驱动 3 h0 Z5 ~8 l6 U" k6 j8 z- f' c) l
数据的标准化不仅方便了自己而且也方便了其他人。比方说,假 7 v3 o) d. I% }: E' N* K! q" ]3 U 如你的用户界面要访问外部数据源(文件、XML 文档、其他数据库等), 6 p; r8 g5 z( ~" V 你不妨把相应的连接和路径信息存储在用户界面支持表里。还有,如) K/ p! ~0 m) N
果用户界面执行工作流之类的任务(发送邮件、打印信笺、修改记录2 J# W9 R/ N( W$ C
状态等),那么产生工作流的数据也可以存放在数据库里。预先安排8 b; U3 v* i8 r0 }3 k$ |: C5 Y) f
总需要付出努力,但如果这些过程采用数据驱动而非硬编码的方式, 8 ~( Z. B8 G0 c0 P, q 那么策略变更和维护都会方便得多。事实上,如果过程是数据驱动的, * e/ h: g+ m4 }( P5 ~, x 你就可以把相当大的责任推给用户,由用户来维护自己的工作流过程。 ( S5 j9 `/ i, c9 d/ m4 L5 E* W5 O; ~+ n9 x0 e$ \! i
■ 标准化不能过头 8 X0 b. F' s3 s7 L; f( k0 B& m- ?6 H) d7 n1 F. W5 l
对那些不熟悉标准化一词(normalization)的人而言,标准化8 d3 }$ c" Y% x5 r2 \, S
可以保证表内的字段都是最基础的要素,而这一措施有助于消除数据 5 T+ h2 G1 ]' o$ g D6 {: @* m 库中的数据冗余。标准化有好几种形式,但 Thi rd Normal Form : f' B: J M% }! c (3NF)通常被认为在性能、扩展性和数据完整性方面达到了最好平" D5 S) `- k% x- U4 ]
衡。简单来说,3NF 规定:# z2 {, O! \8 N( \3 F+ T+ U
" X7 l: Y+ K5 S& @3 a+ e · 表内的每一个值都只能被表达一次。- R4 d/ c, r8 q2 h/ P/ p! X; W
· 表内的每一行都应该被唯一的标识(有唯一键)。 ' h* {/ `! v5 f4 E. r) |3 w · 表内不应该存储依赖于其他键的非键信息。. v3 {* G' l( p; X9 i; D9 d
! o% I, P6 z: M1 x# s6 u 在命名字段并为其指定数据类型的时候一定要保证一致性。假如$ \' E! \) B- H$ ` L% _. V
字段在某个表中叫做“ag reement_number”,你就别在另一个表里! P7 v: p4 K" p7 M$ S0 j# i
把名字改成“ref1”。假如数据类型在一个表里是整数,那在另一个. u/ d, o# [( S2 Y! Q* r1 U& B
表里可就别变成字符型了。记住,你干完自己的活了,其他人还要用& \$ s R5 u( @ I' h# x, k
你的数据库呢。9 K! n. D# A( @! m4 T- W
: p: h% b# n+ |% G; K+ u) R ■ 仔细选择数字类型" F4 }6 B% l0 w
5 G" b9 v9 N4 N4 h& G% }: W
在 SQL 中使用 smallint 和 tinyint 类型要特别小心,比如,( p( ] g2 X7 x* p) R1 I
假如你想看看月销售总额,你的总额字段类型是 smallint,那么,3 T. t# q) C- R0 `
如果总额超过了$32,767 你就不能进行计算操作了。4 B, l3 }- ?$ I% r; G
: b2 G2 ?2 C( h5 L3 q7 g" B1 A# e9 N
■ 删除标记$ }* o5 K7 i+ q2 @$ P3 a {4 e, V
9 V3 F3 j7 [2 Y6 i H 在表中包含一个“删除标记”字段,这样就可以把行标记为删除。 9 v- I: y! Z7 o 在关系数据库里不要单独删除某一行;最好采用清除数据程序而且要6 X8 Q0 f9 h" f% \2 B- k" M3 Y
仔细维护索引整体性。% J: F6 O3 L) G
/ k3 A9 l/ b; u) v3 C3 h ■ 避免使用触发器8 k& ?" _, i, T/ s' `* n
L8 j" [3 X) k+ e
触发器的功能通常可以用其他方式实现。在调试程序时触发器可 * [9 Y2 J" E6 x9 k# ? 能成为干扰。假如你确实需要采用触发器,你最好集中对它文档化。6 B5 @) L2 J; [2 R# g/ F' w9 T) w
1 k# W* u. o8 \* Z
■ 包含版本机制. {7 h$ F9 @/ K1 K) y
3 I B, b) N0 S/ H' J6 c' U/ v. j 建议你在数据库中引入版本控制机制来确定使用中的数据库的版: \7 `. J% N" l' B" b8 Z
本。无论如何你都要实现这一要求。时间一长,用户的需求总是会改' L1 K# I. ~! x' m
变的。最终可能会要求修改数据库结构。虽然你可以通过检查新字段. X0 A' \% A" j' j- f! ^( P: Y5 z S
或者索引来确定数据库结构的版本,但我发现把版本信息直接存放到3 w6 q. X8 Y, W
数据库中不更为方便吗?。 : H9 x$ w1 U' n / J1 y- ] C$ W: _) b ■ 给文本字段留足余量% Z+ I3 i" Q1 \ p1 r5 L
+ G7 J* Y& s6 D! ^" M" L3 l ID 类型的文本字段,比如客户 ID 或定单号等等都应该设置得9 k8 b `$ F. M( D
比一般想象更大,因为时间不长你多半就会因为要添加额外的字符而3 t, w+ l+ E3 J5 u3 G! K- E. }2 ^
难堪不已。比方说,假设你的客户 ID 为 10 位数长。那你应该把数 % I' |- i1 C. P+ C4 G 据库表字段的长度设为 12 或者 13 个字符长。这算浪费空间吗?是3 C0 }2 K! {$ C4 m' c3 y
有一点,但也没你想象的那么多:一个字段加长 3 个字符在有 1 百8 l5 ?4 x/ J( F* \5 F- g; i
万条记录,再加上一点索引的情况下才不过让整个数据库多占据 + f9 J/ \/ |7 K( {. c# W+ D; h 3MB 的空间。但这额外占据的空间却无需将来重构整个数据库就可以 & {& ?3 Q, s/ ]0 b. C 实现数据库规模的增长了。身份证的号码从 15 位变成 18 位就是最# X- I7 u, i P4 \
好和最惨痛的例子。 / ]$ o! w7 L: \* O9 | & ]; h- K5 `$ M2 n2 p$ y ■ 列[字段]命名技巧2 t$ Z2 N6 o& o# _+ ~# p, Y, O