MyBatis实现高性能搜索与收藏功能:数据模型设计与查询优化

10 分钟阅读
Java进阶开发MyBatisJava数据库优化搜索系统SQL性能优化技术架构

搜索与收藏功能设计

1. 概述

本文将介绍一个搜索与收藏功能的后端技术实现,包括数据模型设计、查询优化等关键技术点。

2. 数据模型设计

2.1 核心数据结构

核心数据结构如下:

{
    "id": 1,
    "name": "红烧排骨",
    "image": "/static/recipes/pork-ribs.jpg",
    "description": "经典美味的红烧排骨,肉质鲜嫩多汁",
    "cookingTime": "45分钟",
    "difficulty": "中等",
    "likes": 2345,
    "collects": 1234,
    "views": 5678,
    "author": {
        "id": 1,
        "nickName": "大厨小张",
        "avatar": "/static/avatars/chef1.jpg",
        "isFollowing": true
    }
}

2.2 数据表设计

系统涉及以下几个主要数据表(伪代码):

  1. cyx_recipe - 菜谱表
CREATE TABLE cyx_recipe (
    id BIGINT PRIMARY KEY,
    name VARCHAR(100),
    description TEXT,
    image VARCHAR(200),
    cooking_time VARCHAR(50),
    difficulty VARCHAR(20),
    likes INT,
    collects INT,
    views INT,
    user_id BIGINT,
    category_id BIGINT
);
  1. cyx_customer - 用户表
CREATE TABLE cyx_customer (
    id BIGINT PRIMARY KEY,
    nick_name VARCHAR(50),
    avatar VARCHAR(200)
);
  1. cyx_user_follow - 用户关注关系表
CREATE TABLE cyx_user_follow (
    id BIGINT PRIMARY KEY,
    user_id BIGINT,
    followed_user_id BIGINT
);
  1. cyx_user_favorite - 用户收藏表
CREATE TABLE cyx_user_favorite (
    id BIGINT PRIMARY KEY,
    user_id BIGINT,
    target_id BIGINT
);

3. 查询优化实现

3.1 搜索查询优化

搜索查询的主要优化点:

  1. 使用LEFT JOIN关联用户表和关注表,保证即使用户未登录也能查询基本信息
  2. 通过CASE语句动态判断是否关注:
CASE
    WHEN #{query.currentUserId} IS NULL THEN 0
    WHEN c.id IS NOT NULL THEN 1
    ELSE 0
    END as is_following
  1. 支持按菜谱名称和分类进行过滤:
<where>
    <if test="query.recipeName != null and query.recipeName != ''">
        and a.name LIKE CONCAT('%', #{query.recipeName}, '%')
    </if>
    <if test="query.categoryId != null and query.categoryId != ''">
        AND a.category_id = #{query.categoryId}
    </if>
</where>
  1. 按收藏数排序展示最热门的菜谱:
order by a.collects desc

3.2 收藏查询优化

收藏查询的主要优化点:

  1. 使用INNER JOIN关联收藏表,只查询已收藏的菜谱
  2. 通过user_id和target_id双重条件确保数据准确性
  3. 复用搜索查询的结果映射,保持数据结构统一

4. MyBatis映射配置

使用ResultMap实现复杂对象映射:

<resultMap id="RecipeDetailMap" type="org.dromara.cyx.domain.vo.SearchInfoVo">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
<!-- 其他基本属性映射 -->
    <association property="author" javaType="org.dromara.cyx.domain.vo.SearchInfoVo$AuthorVO">
        <id property="id" column="author_id"/>
        <result property="nickName" column="author_nickname"/>
        <result property="avatar" column="author_avatar"/>
        <result property="isFollowing" column="is_following"/>
    </association>
</resultMap>

5. 性能优化建议

  1. 索引优化
  • 为recipe表的name、category_id建立索引
  • 为user_follow表的user_id和followed_user_id建立联合索引
  • 为user_favorite表的user_id和target_id建立联合索引
  1. 缓存优化
  • 对热门菜谱数据进行缓存
  • 对用户关注关系进行缓存
  • 使用本地缓存+分布式缓存的多级缓存架构
  1. 分页优化
  • 采用ID范围分页代替OFFSET分页
  • 控制每页数据量
  • 实现滚动加载而非传统分页

6. 总结

本文介绍了美食APP中菜谱搜索与收藏功能的后端实现方案,包括:

  1. 采用合理的数据结构设计
  2. 实现高效的多表关联查询
  3. 使用MyBatis的高级特性
  4. 多方面的性能优化措施

这些技术方案可以为类似的社交型内容平台提供参考。