每天分享一个架构知识
我们总是说数据库3范式,范式其实是一种理想的实现方式。
然而理想很丰满,现实很骨感。
我们做的互联网项目,扩展快,需求变化多,什么事情都得有个度,其实严格遵循范式,就会导致多个表。对于查询不是很友好。
那么什么时候可以进行数据冗余呢?
以我丰富经验,总结了一下几点,如果你有更好的点,也可以私信评论。
1数据查询频繁:如果某个数据在系统中频繁被查询,而且通过联接操作会导致复杂的查询语句或性能问题,可以考虑在不同表之间进行冗余设计,将相关数据冗余存储到一个表中,以提高查询性能。2数据复杂度较高:当数据实体包含大量复杂的关联信息或需要多表联接才能获取完整信息时,可以通过冗余设计将关联信息冗余存储到一个表中,以简化查询操作。3数据报表或统计需求:如果系统需要频繁生成报表或进行统计分析,并且这些操作需要访问大量的数据和复杂的联接操作,可以通过冗余设计将报表或统计所需的数据冗余存储到一个表中,以提高生成报表和统计的性能。
那么这么做有什么优点呢?
1提高查询性能:通过数据冗余,可以避免复杂的联接操作和多表查询,减少查询语句的复杂度,从而提高查询性能和响应速度。2简化系统设计:数据冗余可以简化系统设计和查询逻辑,减少开发复杂度和维护成本。3支持报表和统计:通过冗余设计,可以提前计算和存储报表和统计所需的数据,从而加快报表和统计的生成速度。
那么如何实现表的冗余设计呢?
1冗余列:在一个表中添加冗余列,将其他表中的数据冗余存储到该列中,以避免联接操作。2冗余表:创建一个新的表,将相关的数据冗余存储到该表中,以简化查询操作。3数据同步:通过触发器、定时任务或其他机制,将数据从源表同步到目标表中,以提供冗余备份和查询性能的优化。canal 同步到nosql 大宽表
在实施数据冗余设计时,需要注意数据一致性和更新维护的问题。由于数据冗余会导致数据的冗余存储和更新的复杂性,需要确保对冗余数据的维护和同步机制的正确性,以避免数据不一致的问题。同时,也需要权衡冗余设计带来的存储成本和维护复杂性,并根据具体的系统需求和性能要求选择适合的实现方式。
最后一个问题
在实施数据冗余设计时,保持数据一致性的方式有那些?
- 事务管理:使用数据库事务来确保在进行数据更新或插入操作时的原子性和一致性。在涉及到冗余数据的更新操作时,确保所有相关数据的更新在同一个事务中进行,要么全部成功,要么全部回滚。
- 数据同步机制:使用合适的数据同步机制来确保冗余数据的同步和一致性。可以考虑使用触发器、定时任务或消息队列等机制来监测和同步源数据和冗余数据之间的变化。
- 异步更新:在更新源数据后,异步地更新冗余数据。通过使用消息队列等异步机制,将源数据的变更事件发送到冗余数据的更新程序,以减少源数据更新操作的延迟。
- 定期检查和修复:定期检查冗余数据与源数据的一致性,并进行必要的修复操作。可以通过定期运行校验脚本或作业来比较源数据和冗余数据的差异,并纠正不一致的部分。
- 数据审计和监控:实施数据审计和监控机制,记录冗余数据的变更历史和监控数据一致性。通过记录和监控,可以及时发现数据一致性问题并进行处理。
- 数据访问控制:限制对冗余数据的直接访问,只允许通过指定的渠道或接口访问冗余数据。这样可以确保数据的一致性维护在冗余数据的更新程序中进行。
- 自动化测试:实施自动化测试,包括单元测试和集成测试,用于验证冗余数据的一致性和正确性。通过编写和运行测试用例,可以及时发现和修复冗余数据的问题。
学习架构首先得懂的架构设计的原则,下面是一些经典书籍,感兴趣的可以看看
- 《软件架构设计的艺术》(The Art of Software Architecture) - Stephen T. Albin 著
- 《软件架构师实践指南》(Software Architecture for Developers) - Simon Brown 著
- 《软件架构设计模式》(Software Architecture Design Patterns in Java) - Partha Kuchana 著