一、添加冗余字段
所谓冗余字段,就是在主要的信息上,添加上一些辅助的字段(比如搜索框中的搜索关键字,列表中的列表项等,这些信息都是由其他主体或业务上来的),用添加列的方式,来替换掉使用left join或inner join的方式获取数据,实现列表数据或报表数据的展示,这种方式是违背了数据库三范式的设计的,可能只是满足了三范式中的第一范式或者满足了第一,第二范式,这种方式在实现上,需要在数据录入的时候,将所需的信息都得到,并放入到相应的列上。
适用范围:单体服务,分布式微服务,DDD方式设计的领域服务中心均可,即便是进行了分库分表,也同样适用
缺点:信息录入时候,需要将要使用到的信息都获得到,并将其放入到相应的字段上去,在并发的时候,会存在性能问题
二、小表广播
在业务开发中,之所以需要进行多表联查,是因为很多数据是动态可变的,只是在主表中存入了关联表的关联主键,在需要进行数据展现的时候,通过关联主键,得到关联表的信息,进而进行数据的拼接和处理,最终通过服务的方式体现出来。
这种处理方式,主要是针对主表数据量大,但是关联表数据量小,并且关联表的数据变化频繁的情况下,在分布式的微服务系统中,使用这种方式。
难点是:所谓的小表,其实就是另外一个服务中的副本表,但是这个副本表的信息要远远小于副本的主题表,这样的情况下,主题表的信息同步到副本表,就是一个很重要的事情。既要保证数据的准确性,还要保证数据的及时性,对实现有着比较高的要求。
适用范围:分布式微服务分库情况下,列表上的信息需要从其他一个或几个微服务数据库中而来
缺点:实施难度大,数据同步要求高
三、建立集中的服务
建立一个专供的微服务,背后有一个专门的数据库,通过某种同步机制,把各种需要联合查询的信息同步到这个库,然后这个微服务就专门提供这类联表查询,适合实时性要求不高的分析场合。
这种处理方式,主要还是使用sql的方式去解决问题,即使用数据库引擎去处理数据关联的事情。
难点是:关联数据的实时同步,同步的准确性,以及服务的稳定性,对实现有着比较高的要求
适用范围:分布式微服务分库情况下,列表上的信息需要从其他一个或几个微服务数据库中而来
缺点:实施难度大,数据同步要求高,关联性管理梳理
四、基于数据中心
数据中心可以通过各种数据同步工具将关系型数据库中的数据抽取出来,放到hdf上去,可以根据关联性存到类sql的hive上,或者是列式数据库hbase上去,然后再通过API的 方式向外提供数据服务,当然也可以按照关联关系将数据放入es上去,基于es来提供数据服务。
基于数据中心的这种处理方式,可以比较好的实现数据服务的功能,但是也有它自己的不足,主要体现在实时性上。
难点是:如何保证数据的实施性,如何建立好数据的关联性,同样既要保证数据的准确性,还要保证数据的及时性,对实现有着比较高的要求
适用范围:单体服务,分布式微服务,DDD方式设计的领域服务中心均可
缺点:需要会大数据处理的人才,需要更多的服务器资源,需要更多的项目投入(时间),需要保证数据的准确性,一致性,及时性。
实时要求高的场合,上大数据,流处理,同样也是相关关联的数据以流的方式进行计算得到你用关系数据库必须联表才能得到的数据。
其他的方式,如在内存中进行分页搜索查询,使用CQRS方式,或者是其他,总之都可以解决数据联查,数据显示的问题
时间工具类:
MyBatis-plus框架,自动生成映射文件的工具会将MySQL中的datetime类型转化成java中的LocalDateTime类型
Java中LocalDate、LocalTime、LocalDateTime三个时间工具类的使用介绍:
在jdk8发布的时候,推出了LocalDate、LocalTime、LocalDateTime三个时间处理类,以此来弥补之前的日期时间类的不足,简化日期时间的操作,在jdk8之前,处理日期时间的类是Date、calendar,这两个不是线程安全的
新推出来的这三个类,与MySQL中的 日期时间类型正好对应,如果我们使用的是MySQL数据库的话,在插入相应字段的时候,都不需要再进行任何的转化了
LocalDateTime对应datetime
LocalTime对应time
LocalDate对应date