回城传送–》《100天精通MYSQL从入门到就业》

零、前言

今天是学习 SQL 打卡的第 39 天。

​ 我的学习策略很简单,题海策略+ 费曼学习法。如果能把这些题都认认真真自己实现一遍,那意味着 SQL 已经筑基成功了。后面的进阶学习,可以继续跟着我,一起走向架构师之路。

今天的学习内容是:SQL设计优化-反范式设计

一、练习题目

二、SQL思路

【第39天】SQL进阶-SQL设计优化-反范式设计(SQL 小虚竹)-LMLPHP
【第39天】SQL进阶-SQL设计优化-反范式设计(SQL 小虚竹)-LMLPHP

初始化数据

什么是反范式设计

反范式设计,是违背数据库范式的设计原则,通过引入冗余数据来优化查询性能或满足特定业务需求的设计方法。
在范式设计中,我们追求的是数据的原子性、完整性和一致性。
而反范式设计则更注重于性能业务需求的满足。

例子

假设我们有一个在线电商平台的订单系统,其中涉及到用户、商品和订单等多个实体。在范式设计中,我们可能会将用户信息、商品信息和订单信息分别存储在不同的表中,并通过外键关联这些表。然而,在某些场景下,为了提高查询性能,我们可能会采用反范式设计。

例如,为了快速获取某个用户的订单总数和订单金额。

我们可以在用户表中直接添加“订单总数”和“订单总金额”这两个字段,并在每次用户下单或订单状态变更时更新这些字段的值。这样,当我们需要查询用户的订单信息时,就可以直接查询用户表,而无需通过复杂的JOIN操作关联多个表。

反范式设计的优点

  • 提高查询性能:通过引入冗余数据,可以减少查询时需要关联的表的数量,从而提高查询速度。
  • 简化业务逻辑:在某些场景下,反范式设计可以简化业务逻辑,减少代码复杂度。
  • 满足特定业务需求:有时为了满足特定的业务需求,我们可能需要打破范式设计的约束。

反范式设计的缺点

  • 数据冗余:反范式设计会增加数据的冗余度,占用更多的存储空间。
  • 数据一致性维护困难:当数据冗余时,如果更新操作没有同步进行,可能会导致数据不一致的问题。
  • 增加维护成本:在数据冗余的情况下,当需要修改数据结构或数据时,可能需要更新多个地方,增加了维护成本。

实战中要注意的坑

  • 谨慎使用:反范式设计并不是一种通用的解决方案,应该根据具体的业务需求和性能要求来谨慎使用。
  • 合理控制冗余度:在引入冗余数据时,要合理控制冗余度,避免过度冗余导致的问题。
  • 确保数据一致性:在反范式设计中,要特别注意数据一致性的维护,确保更新操作能够同步进行。
  • 定期评估和调整:随着业务的发展和变化,可能需要定期评估和调整数据库结构,以适应新的需求和挑战。

三、总结

反范式设计是数据库设计中的一种特殊手段,它通过引入冗余数据来优化查询性能或满足特定业务需求。
在使用反范式设计时,我们需要权衡其优缺点,并根据实际情况谨慎使用。
同时,在实战中要注意避免一些常见的坑,确保数据库结构的稳定性和高效性。

这题的答案就直接说了:
反范式优化的主要动机和思路是:

  • 通过适当增加冗余字段,减少连接查询的次数和复杂度
  • 对于经常发生的聚合计算,如果对实时正确性要求不高,可以缓存中间结果,减少实时的聚合计算压力
  • 用适度的写冗余,换取读操作的大幅优化
  • 适当的放宽索引,可以优化局限于少数字段的查询性能

四、参考

我是虚竹哥,我们明天见~

05-28 09:19