数据库范式:掀起你的盖头来(3)

3                 范式的两面:天使与魔鬼

有人说:掌握了数据库范式你就是数据库设计高手了!!

呵呵,成为高手看来也很简单的啊:)但此话对了一半,掌握数据库范式可以算一般高手,因为毕竟能够掌握范式并应用的人不算很多;但算不上高高手,为什么呢?因为范式不是万能的,也有自己的适应范围和局限性,如果到处不加原则和场合的使用,它很可能就是一个带给你梦魇的魔鬼!

首先我们看看数据库范式的目的是什么?范式的主要目的有三个:

1)       减少数据冗余

2)       优化表结构

3)       避免操作异常

从以上三个目的我们可以看出,范式的主要作用是和数据存储有关的,它要解决的问题是数据存储的问题。为了解决这些问题,范式的最终动作其实就是将表拆分,将表拆成更多的表。

但是我们在实际应用过程中,不可能把数据存起来就不管了,而是要存要取,否则存起来有什么意义呢:)既然要涉及到数据读取,那么数据读取的性能当然也是要重点关注的;另外,程序是人写的,对于人来说,表是否容易理解、是否容易使用,也是相当重要的。如果表的数量很多、关系太复杂,使用的时候很容易出错。下面我们看看范式在这两点上的限制。

范式的限制主要有如下几个:

1)  表数量增多会带来更多的连接查询,而连接查询的效率肯定比不上单表查询;

2)  表数量增多会导致表的关系复杂,SQL语句会更加难写,表的关系也会更加难理解;

基于以上两个限制,数据库设计中还有一个概念叫做“反范式”,反范式很简单,从字面意思上理解即可,就是范式的反操作。下面是简单的对比:

------------范式------------------------------   反范式----------------------

目的   解决存储问题                解决性能问题和使用问题

动作   拆表                            合表

效果   存储优化                        性能优化

-------------------------------------------------------------------------------------

看到这里,可能会有人问:那是不是没有范式就是性能最好的呢?非也,因为影响性能的除了连接查询外,还有一个关键因素就是“锁”,如果所有信息都在一张表里面,那么对这张表的所有操作之间的冲突会非常厉害,反而会导致性能急剧下降。

 

因此,数据库设计最终应该是在“范式”和“反范式”之间进行权衡,找到最佳的平衡点,只有这样才是一个真正的数据库设计高手!!

 

到此数据库范式的盖头已经被我们全部掀开,当然最后发现这既不是一个俊媳妇,也不是一个丑媳妇,只是一个可以和我们过设计日子的普普通通的媳妇而已:)

 

====================================================================

欢迎大家交流指证!!!可以直接在博客中发表意见,也可以直接给我发邮件:yah99_wolf@yahoo.com.cn

上一篇:中小企业如何借力工业互联网抵抗死亡潮?


下一篇:Digester:一个通用xml引擎的设计剖析