这些被塞满了分隔符的数据列需要特别注意,并且一个较好的办法是将这些字段移到另外一个表中,使用外键连接过去,同样地以便于更好的管理。
51Testing软件测试网%H;\#ju'BW
那么,让我们现在就应用规则2(第一范式) “避免重复组” 吧。你可以看到上面这个图表,我创建了一个单独的 syllabus(课程) 表,然后使用 “多对多” 关系将它与 subject(科目) 表关联起来。
X
J%H EI1`q8g&}0 通过这个方法,主表(student 表)的 syllabus(课程) 字段就不再有重复数据和分隔符了。51Testing软件测试网}qA3L5f5P1eK5I2d p
◆ 规则6:当心那些仅仅部分依赖主键的列51Testing软件测试网#\)MG `a
O
-YC#M$F,N#z,K0 留心注意那些仅仅部分依赖主键的列。例如上面这个图表,我们可以看到这个表的主键是 Roll No.+Standard。现在请仔细观察 syllabus 字段,可以看到 syllabus(课程) 字段仅仅关联(依赖) Standard(课程级别) 字段而不是直接地关联(依赖)某个学生(Roll No. 字段)。
_X/uf0i8}0 Syllabus(课程) 字段关联的是学生正在学习的哪个课程级别(Standard 字段)而不是直接关联到学生本身。那如果明天我们要更新教学大纲(课程)的话还要痛苦地为每个同学也修改一下,这明显是不符合逻辑的(不正常的做法)。更有意义的做法是将这些字段从这个表移到另外一个表,然后将它们与 Standard(课程级别)表关联起来。51Testing软件测试网0JW2U'x x
你可以看到我们是如何移动 syllabus(课程)字段并且同样地附上 Standard 表。
@9Zo1m#T*vO0 这条规则只不过是 “三范式” 里的 “第二范式”:“所有字段都必须完整地依赖主键而不是部分依赖”。
#|D7uF6cP3KO;a)L0 ◆ 规则7:仔细地选择派生列51Testing软件测试网
D:J#SOESjK7mOE
51Testing软件测试网h'j8wa2n D3A
如果你正在开发一个 OLTP 型的应用程序,那强制不去使用派生字段会是一个很好的思路,除非有迫切的性能要求,比如经常需要求和、计算的 OLAP 程序,为了性能,这些派生字段就有必要存在了。51Testing软件测试网 ?TC{+Gb~Bl[T
通过上面的这个图表,你可以看到 Average 字段是如何依赖 Marks 和 Subjects 字段的。这也是冗余的一种形式。因此对于这样的由其他字段得到的字段,需要思考一下它们是否真的有必要存在。
+_8Ja`*\,WX `]C0 这个规则也被称为 “三范式” 里的第三条:“不应该有依赖于非主键的列”。我的个人看法是不要盲目地运用这条规则,应该要看实际情况,冗余数据并不总是坏的。如果冗余数据是计算出来的,看看实际情况再来决定是否应用这第三范式。51Testing软件测试网6zixk
~:@.kZ
◆ 规则8:如果性能是关键,不要固执地去避免冗余
~3sO|/|^0
E%n5~.M]{l]:l0 不要把 “避免冗余” 当作是一条绝对的规则去遵循。如果对性能有迫切的需求,考虑一下打破常规。常规情况下你需要做多个表的连接操作,而在非常规的情况下这样的多表连接是会大大地降低性能的。51Testing软件测试网*Sho;dd
◆ 规则9:多维数据是各种不同数据的聚合51Testing软件测试网]6y ^:g*L_3~Te'B
OLAP 项目主要是解决多维数据问题。比如你可以看看下面这个图表,你会想拿到每个国家、每个顾客、每段时期的销售额情况。简单的说你正在看的销售额数据包含了三个维度的交叉。
8H:G[)a?8C;B051Testing软件测试网1B'S2Z
`U
为这种情况做一个实际的设计是一个更好的办法。简单的说,你可以创建一个简单的主要销售表,它包含了销售额字段,通过外键将其他所有不同维度的表连接起来。
*G.p]"i*DmNZ051Testing软件测试网,bo2a.Y
L(g"cP
j4_!NqDc fr/o8l0◆ 规则10:将那些具有“名值表”特点的表统一起来设计
.s2{,h(C2pB0j051Testing软件测试网 i Rst:k8dJk 很多次我都遇到过这种 “名值表” 。 “名值表” 意味着它有一些键,这些键被其他数据关联着。比如下面这个图表,你可以看到我们有 Currency(货币型)和 Country(国家)这两张表。如果你仔细观察你会发现实际上这些表都只有键和值。
pw
{p'HHj09}o/ol!di7P C/v0 对于这种表,创建一个主要的表,通过一个 Type(类型)字段来区分不同的数据将会更有意义。51Testing软件测试网'iq f#~2?!f
C
◆ 规则11:无限分级结构的数据,引用自己的主键作为外键51Testing软件测试网n e!iq$t^
我们会经常碰到一些无限父子分级结构的数据(树形结构?)。例如考虑一个多级销售方案的情况,一个销售人员之下可以有多个销售人员。注意到都是 “销售人员” 。也就是说数据本身都是一种。但是层级不同。这时候我们可以引用自己的主键作为外键来表达这种层级关系,从而达成目的。
{@{T2c051Testing软件测试网fW]0k.c
这篇文章的用意不是叫大家不要遵循范式,而是叫大家不要盲目地遵循范式。根据你的项目性质和需要处理的数据类型来做出正确的选择。
e2];V5ASpV/E(d;DW051Testing软件测试网-p3}#@+F@