数据库的规范化和反规范化

最简单的SQL数据库中,所有的数据都在一张表内,这张表看起来大概是这样的:

db_sample

然而,在现代工业界,数据库存储的数据比上面这张表要多的多的多的多。从而,有数据库的规范化和反规范化概念的出现,那么他们到底是什么,又有什么区别呢?
规范化后的数据库通常会有多个表。数据通过一定的规则进行分割,从而分配到不同的表中去。分割的条件包括3NF,BCNF,等等。我们可以通过数据的依赖关系(Functional Dependencies)使用join操作找到所有的数据。数据库规范化的好处在于减少了数据库的冗余度和保证了数据的一致性。所有的数据列都被分割为许多小的表而存储。

  • 去除冗余度

在规范化之前,有可能出现如下的数据:

城市 省份 缩写
长沙 湖南
邵阳 湖南
株洲 湖南
岳阳 湖南
湘潭 湖南
凤凰 湖南

我们可以看到其实后两项出现了重复,利用数据库的规范化我们可以把数据库优化为如下的两个:

城市省份表

城市 省份
长沙 湖南
邵阳 湖南
株洲 湖南
岳阳 湖南
湘潭 湖南
凤凰 湖南

省份缩写表

省份 缩写
湖南
XX X

优化过后我们可以明显发现我们的数据库变的更加的精简 some text

  • 完整性

有时候由于一些数据库在最初设计时的考虑不周全,导致一个主键对应了表中的多个行,通过规范化把表分割可以解决这一问题。

但是,规范化也有他的坏处,那就是每一个query查询操作都可能导致多个表的join操作,当数据量很庞大的时候,这种操作的性能是很低的,而当query操作频繁时,这将导致整个系统的性能下降。但是如果我们将所有的数据都放在一个表中,query的速度就会得到显著的提升,我们甚至可以通过索引使查询操作的速度进一步提升。尽管可能带来冗余的数据,但是我们损失的性能有时候会比硬盘存储空间更加珍贵。

我们并不是说规范化和反规范化中我们必须选一个或另一个; 数据库不必被归一化到第n级或完全非规范化到一个表中。 如果因为查询的复杂性导致查询运行速度太慢,我们可以将数据库非规范化,以消除太多数据库之间的连接。而如果数据库是一个巨大的数据,我们可以通过规范化适当组织数据库摆脱冗余。所有的一切都是trade-off.