问题

数据库的冗余度是不是越小越好?

回答
咱们聊聊数据库的“冗余度”,这玩意儿是不是越小越好,其实吧,这事儿得分两头看,不能一概而论。

什么是数据库冗余?

简单来说,数据库冗余就是同一份数据在数据库中出现不止一次。想象一下,你在一个客户名单里,有个客户的地址在“客户信息表”里出现了一次,又在“订单表”里又出现了一次。这就是冗余。

为什么我们通常说“冗余越小越好”?

这是因为,在大多数情况下,过度的冗余会带来不少麻烦,就好比你家有个东西,到处都有,找起来就费劲,而且还容易出错:

1. 存储空间浪费: 最直观的,数据重复存储,自然占用了更多的磁盘空间。在数据量越来越大的今天,这可不是个小数目。
2. 数据一致性问题(“更新异常”): 这是最致命的。如果你的数据在多个地方都有,那么当你需要修改某个信息时,你必须确保所有出现过的地方都同步更新。要是漏掉了一个,那数据库就“分裂”了,有的地方是旧地址,有的地方是新地址。用户看到的数据就不一致了,导致系统出现错误。比如,客户搬家了,你只更新了客户信息表,但订单表里的地址还是旧的,那下次再给他寄东西,就寄错了地方。
3. 数据插入和删除的困难(“插入异常”和“删除异常”):
插入异常: 有时候,你可能想插入一条新记录,但某些属性是重复的,而且这些重复属性本身又构成了一个完整的实体。比如,你有一个“订单”表,里面记录了客户ID和客户姓名。如果你想添加一个新订单,但这个客户之前从未下过单,你就没法只插入订单信息,因为你没有客户ID对应的客户姓名,也就没法同时记录客户姓名。你可能需要先去客户表里添加客户信息,才能再添加订单。
删除异常: 删除一条记录,可能会意外地删掉其他重要的、不应该被删除的信息。比如,你在一个表里同时存储了客户信息和他们下的订单。如果你删掉了一个客户的所有订单,可能就把这个客户本身的信息也删掉了,即使你还想保留这个客户记录。

那是不是就绝对不能有任何冗余?

也不是。在某些特殊情况下,适度的、有策略的冗余,是为了提升查询性能,也叫做“反范式设计”或者“为性能而做的冗余”。

什么时候我们会考虑容忍一些冗余呢?

1. 提高查询速度(“读多写少”的场景): 数据库设计有一个原则叫“范式化”,它旨在消除冗余,保证数据的一致性,但有时候,过度范式化会导致查询时需要进行大量的表连接(JOIN),这会大大降低查询的效率。在一些“读多写少”的场景,比如报表生成、数据分析,我们可能会故意引入一些冗余,把一些经常一起查询的数据存储在同一个表中,这样就可以避免复杂的JOIN操作,直接从一个表中读取数据,速度会快很多。
举个例子: 假设你有一个“订单”表,里面有“订单ID”、“客户ID”、“客户姓名”、“商品ID”、“商品名称”、“数量”。如果严格范式化,客户姓名和商品名称应该分别存在“客户表”和“商品表”里,每次查询订单的时候,都需要JOIN这两个表来获取客户姓名和商品名称。如果业务场景是经常要看带有客户姓名和商品名称的订单列表,那么把客户姓名和商品名称直接放在“订单表”里(虽然是冗余),就可以省去JOIN,查询速度会显著提升。

2. 简化复杂查询: 有时候,为了简化用户直接操作数据库的复杂性,或者为了方便某些特定应用的功能实现,也会引入一些冗余。

所以,结论是什么?

数据库的冗余度不是越小越好,而是需要平衡。

理想状态下,我们追求的是“最小的、必要的冗余”,也就是说,我们要尽量消除那些可能导致数据不一致、存储浪费的“坏”冗余,但可以有意识地引入一些“好”的、为了提升性能的冗余。
关键在于“权衡”:你需要根据你的应用场景、数据访问模式(是读多还是写多?)、对数据一致性的要求有多高、以及对查询性能有多高的需求,来做出设计决策。
“规范化”是基础: 在设计数据库时,通常我们会先遵循范式化的原则,消除大多数的冗余,确保数据的基本一致性和结构的合理性。
“反规范化”是优化: 当我们发现某个地方性能瓶颈很大,而且通过其他方式(比如索引、缓存)无法解决时,我们才会考虑适度的反规范化,引入一些可控的冗余来换取性能。

总而言之,设计数据库就像做菜,你不可能只放盐,也不能什么调料都放。关键是要懂每种“调料”(范式化、反规范化、索引等)的作用,根据“菜品”的要求(业务需求、性能要求)来合理搭配,才能做出美味又营养(高性能、高一致性)的“数据库大餐”。

网友意见

user avatar

好问题。

  1. 最早的时候,我们的确是认为数据库的冗余度越低越好,为此产生了很多范式。没错,就是咱们在数据库教科书上学的那种范式。那时候存储设备很贵,能省一点是一点儿。
  2. 后来,后来随着社会主义的进步,存储设备便宜了,不需要那么精打细算了。同时,人们发现,适当冗余可以方便一些常用的查询,而不需要每次都join。于是,人们开始在表中冗余越来越多的字段,并通过事务等方式保持各表之间相同字段的一致性。甚至让数据库承担越来越多的搜索和分析功能,为此必须加入越来越多的索引。直到,插入数据插不动了。
  3. 于是,人们又开始反思,是不是应该把不同的职责从数据库中拆出来,让专业的库做专业的事。人们开始意识到读写分离的意义,主库开始变得轻装上阵,后续的搜索和分析工作由专门的es, hive等服务支持。通过CDC等方案保持各数据库直接的数据一致性。
  4. 时代在变。

突然想起来我还有一篇公众号文章,也许对大家处理多数据库之间的数据一致性有帮助。

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有