一、什么是数据冗余?
在大数据领域,冗余一般是指一模一样的数据存储多于一份的情况。
比如,我们建了一张数据库表aa(PS:可以先不往下看答案,首先思考一下能不能发现什么问题哈)
CREATE TABLE aa
(姓名 varchar(25),
姓varchar(25),
名varchar(25),
出生日期varchar(25),
年龄varchar(25),
驾驶证类别varchar(25),
初领驾照时间varchar(25),
驾龄年限varchar(25)
)
数据实例如下:
('张三','张','三','1986-03-01',30,'C1','2015-01-01',1)
分析本例字段,可以发现以下几点问题:
1、 从一般的逻辑来说,“姓名”这个字段是可以由“姓”、“名”两个字段推断出来的,“姓”和“名”收尾相接就能得到“姓名”这个字段;
2、 “年龄”是可以从“出生日期”这个字段推断出来的,在任意时刻使用当前日期与“出生日期”相减就能得到“年龄”这个字段;
3、 “驾龄年限”也是可以通过“初领驾照时间”推断出来的,在任意时刻使用当前日期与“初领驾照时间”相减就能得到“驾龄年限”。
以上这种情况就是有数据冗余的情况,是不是很容易理解?!
二、数据冗余的缺点
世界上万事万物的存在都有一定的道理,马克思主义哲学教我们实事求是、一分为二的来看问题,不要搞一刀切说一定不可行或者一定可行。首先来看缺点:
1、 造成维护成本的提高:比如现在描述的张三是30岁,明年他就31岁了,是否还需要一个程序功能自动或手动对这个字段进行更新?如果在系统运行过程中发现在登记的时候“初领驾照时间”这一字段填写有误需要更正,那么“驾龄年限”也需要同步修改。所以,冗余的问题是,如果其中一个相关的字段发生变化,则另一个字段也必须相应地做出变化,否则就会出现信息矛盾或者不一致的现象。这对于保持数据一致性来说,是需要消耗维护成本的;
2、 造成资源浪费:数据库存储的空间是一定的,如果冗余数据过多的话,会造成资源的浪费。
三、数据冗余的缺点
冗余的优点也是可圈可点的,那么它的优点是什么呢?
1、 提高查询性能:
举例如下:某个数据表有以下字段:
(用户ID,1月消费额,2月消费额,3月消费额,4月消费额,5月消费额,6月消费额,7月消费额,8月消费额,9月消费额,10月消费额,11月消费额,12月消费额,全年消费总额),其中,有一个“全年消费总额”的冗余字段,用来做前面12个月的消费额的加和。如果这个系统里有5000万用户,应该怎么统计这5000万用户一年的消费总额?在没有“全年消费总额”这个字段的情况下,需要让计算机做6亿个数值对象的加法(12次×5000万),在有了这个字段的情况下,只需对这5000万个向量的最后一个字段——“全年消费总额”做加和,即做5000万个数值对象的加法即可,这两者在计算效率上有11倍的速率差距。
这11倍速率的差距意味着什么呢?如果这5000万个向量的计算需要2小时,那么这种计算可以在凌晨进行,并且次日一早做成报告。而6亿个向量时间计算很可能需要22小时,那么这种报告就只能第三天才能送达。这不仅仅是一个计算效率的问题,甚至影响了一个业务的反馈和完整流程。
再比如有两张表,一张为字典表city,其中存放有城市的id 和 名称(cityName) 两个字段;另有有一张业务表custumers,其中有消费者姓名,消费者 id 、cityId(城市的ID)、消费金额、消费品牌、消费型号等字段。
如果想查询业务表某个城市的消费情况,就必须将业务表 custumers和字典表city首先进行关联,来获cityId代表的城市名称cityName,取如果业务表用户量很大很大,那么就会查询的很慢,这个时候我们就可以使用冗余来解决这个问题,直接将业务表中的 增加 cityName字段,这样我们在查询业务表的时候就不需要去关联 city 的字典表了。这样的方式显然是不符合我们数据库设计的范式的,但是这样的冗余或许很有必要。
2、 其他优点
(1)数据恢复,如建立备份文件以备正式文件被破坏时恢复;(2)数据核查,如设立数据校验位可以检查数据在存贮、传输等过程中的改变; (3)数据使用的便利,如为了查看数据的直观,使用数据的方便、高效。 (4)减少数据通讯开销,如分布式数据库在不同场地重复
冗余信息被作为加快数据访问速度的手段应用最多的情况一般不是在一个表里设置冗余字段,而是在很多海量数据的数据仓库里把很多小粒度的数据计算成为以一天、一周、一个月作为更大粒度统计单位的冗余信息表或者指标信息表,而直接访问这些大粒度的冗余数据,比直接访问最小粒度的数据进行统计效率可能快上几千倍
数据冗余或者信息冗余是生产、生活所必然存在的行为,没有好与不好的总体倾向。而对于自然界,则是物质存在的一种形式,是客观存在情况。例如每个人都有与其他人基本相同的基因。至于在具体的应用场景里是否使用冗余字段需要应用者根据系统设计的经验和自己的实际需求去判断,应选择在满足自己系统业务运转要求的前提下“成本”更低的方式。