DDD死党:单引擎查询利器( 四 )

  • 维度结构应该与表的索引结构保持一致,以保障所有的查询,都能应用索引 。
  • 索引维度体现在方法签名中 , 并且保障满足最左匹配原则 。
  • 多维索引,可以基于最左匹配原则生成多组方法;索引列(A,B),可以生成 A、AandB 两组方法 。
  • 假如在order表中存在一个索引(user_id, status) , 那么可以存在以下查询:
    // 可以支持多组高效查询// User维度查询对象@Datapublic class QueryOrderByUser {// user id 不能为 null,不然无法使用索引@NotNullprivate Long userId;private Integer status;private Pageable pageable;}// User 和 Status 维度查询@Datapublic class QueryOrderByUserAndStatus {// user id 不能为 null,不然无法使用索引@NotNullprivate Long userId;// status 不能为 null,不然无法使用索引@NotNullprivate Integer status;private Pageable pageable;}// 查询服务如下public interface OrderService {// User 维度查询List<Order> listByUser(QueryOrderByUser query);Long countByUser(QueryOrderByUser query);Page<Order> pageByUser(QueryOrderByUser query);// User 和 Status 维度查询List<Order> listByUserAndStatus(QueryOrderByUserAndStatus query);Long countByUserAndStatus(QueryOrderByUserAndStatus query);Page<Order> pageByUserAndStatus(QueryOrderByUserAndStatus query);}这样便可以在性能和扩展性间找到一个良好的平衡点 。
    • 性能 。由 MySQL 的索引进行保障,可能不是最优解(存在回表)但绝对不是最差情况 。
    • 扩展性 。默认查询维度(get、list、count、page)基本能满足日常业务开发;查询条件也可基于 Query Object 进行扩展;
    3、框架与标准化
    我们需要一个框架,在满足原则和规范前提下,灵活的定制简单数据查询,但又不能过于灵活,需要对使用方式进行严格限制 。
    灵活定制,快速开发,提升效率,降低bug;对使用进行限制 , 是为了将掌控权控制在开发,不会因为使用不当造成线上问题 。因此,对框架有如下要求:
    • 支持灵活的查询定义,无需手写 SQL 。
    • 支持常见的查询,包括过滤、排序、分页等 。
    • 多 ORM 支持,提供对 MyBatis 和 Jpa 框架支持 。
    框架整体流程如下:
    DDD死党:单引擎查询利器

    文章插图
    该模式下,开发查询功能只需:
    • 根据业务需求定义 QueryObject,主要包括过滤、排序、分页等 。
    • 使用 QueryObject 调用 QueryRepository 相关接口完成查询,常见功能包括:单条查询、列表查询、计数查询、分页查询等 。
    只需在QueryObject上进行定义,无需编写 SQL,由框架对 QueryObject 进行解析,完成动态查询 。
    核心功能全部在 QueryRepository 中,其核心流程如下:
    DDD死党:单引擎查询利器

    文章插图
    流程如下:
    • 验证参数:基于 Spring Validate 框架完成基本的参数校验 。
    • 解析QueryObject:从 QueryObject 中提取信息 , 转为为 ORM 的查询对象 。
    • 设置最大返回值:【可配】设置最大返回值,避免结果太多造成性能低下 。
    • 执行查询:调用 ORM 框架的查询接口执行查询命令 。
    • 处理查询结果:【可配】对查询结果进行处理打印日志 or 异常中断 。
    为了支持多个 ORM 框架,整体结构设计如下:
    DDD死党:单引擎查询利器

    文章插图
    核心模块包括:
    • API:提供统一的接口和配置能力 , 对使用方式进行规范; 。
    • MyBatis 实现:基于 MyBatis 实现 API 中定义的全部功能 , 完成与 MyBatis 框架的集成 。
    • JPA 实现:基于 JPA 实现 API 中定义的全部功能 , 完成与 JPA 框架的集成 。
    (1)统一 API提供统一的接口和配置能力 , 对使用方式进行规范 。其中包括两大部分:
    1. 注解:使用注解在 QueryObject 的字段上添加配置信息,使其具备过滤能力;


      推荐阅读