今天继续推进 KnowFlow Agent 项目。Day06 已经完成了知识库模块的基础 CRUD 接口,不过当时的数据是保存在内存里的。也就是说,接口虽然可以新增、查询、修改、删除知识库,但是服务一重启,新增的数据就会丢失。
所以 Day07 的主要任务是:把知识库模块接入 MySQL,让知识库数据可以真正保存到数据库中。
一、今日目标
Day07 的目标很明确,就是把 Day06 的“内存版知识库”升级为“数据库版知识库”。
需要完成的内容包括:
新增 MySQL 版 Repository
使用 kf_knowledge_bases 表保存知识库数据
启用 MySQL 时走数据库版本
未启用 MySQL 时保留内存版本
新增知识库名称重复校验
删除知识库时使用逻辑删除
这样做完之后,知识库模块就不只是接口能跑,而是开始具备真实项目中的数据持久化能力。
二、为什么要接入 MySQL
Day06 的内存版实现主要是为了先把接口流程跑通。
当时的调用流程是:
Controller 接收请求
Service 处理业务逻辑
Repository 在内存中保存数据
返回统一 JSON
这种方式适合学习和快速验证接口,但是不适合真实项目。
因为内存数据有一个明显问题:
服务一重启,数据就没了
而企业项目中的知识库数据必须长期保存。例如售后政策、维修流程、退换货规则等内容,不能因为服务重启就丢失。
所以 Day07 要把知识库数据保存到 MySQL 中。
三、保留内存版,新增 MySQL 版
这次并没有直接删掉 Day06 的内存版 Repository,而是保留了它,同时新增了 MySQL 版 Repository。
当前项目支持两种模式:
MYSQL_ENABLED=false:使用内存版 Repository
MYSQL_ENABLED=true:使用 MySQL 版 Repository
这样做的好处是:
如果本地暂时没有启动 MySQL,项目依然可以正常运行和测试。
如果需要验证真实数据库保存效果,就把 MYSQL_ENABLED 设置为 true,后端就会走 MySQL 版实现。
这种设计对本地开发比较友好。
四、新增 JdbcTemplate 配置
Day07 新增了 JdbcTemplate 配置。
JdbcTemplate 可以理解为 Spring 提供的一个数据库操作工具。它可以帮助我们执行 SQL,比如:
SELECT 查询数据
INSERT 新增数据
UPDATE 修改数据
相比直接使用原生 JDBC,JdbcTemplate 会帮我们处理一部分重复代码,比如连接、执行 SQL、结果映射等。
本次知识库 MySQL 版 Repository 就是基于 JdbcTemplate 实现的。
五、知识库表 kf_knowledge_bases
知识库数据保存到数据库表:
kf_knowledge_bases
主要字段包括:
id
name
description
owner_id
status
created_at
updated_at
deleted
这些字段和 Day06 的知识库对象基本对应。
其中比较重要的是:
deleted
这个字段用于逻辑删除。
六、什么是逻辑删除
以前理解删除,可能就是直接把数据库里的记录删掉。
但是在真实项目中,很多时候不会直接物理删除数据,而是使用逻辑删除。
所谓逻辑删除,就是不是真的删除这一行数据,而是把某个状态字段改掉。
例如:
deleted = 0:正常数据
deleted = 1:已删除数据
查询知识库列表时,只查询:
deleted = 0
这样用户看不到已经删除的数据,但数据库里仍然保留记录。
这样做的好处是:
方便后续追踪数据
避免误删导致数据无法恢复
保留历史记录
更符合企业项目的数据管理方式
所以 Day07 删除知识库时,并不是直接删除数据库记录,而是把 deleted 字段更新为 1。
七、增加知识库名称重复校验
Day07 还新增了一个业务校验:知识库名称不能重复。
比如已经存在一个:
售后服务知识库
如果再次创建同名知识库,系统会返回错误:
{
"code": 400,
"message": "知识库名称已存在",
"data": null
}
这个功能看起来很小,但在后台系统中很常见。
如果允许重复名称,后续用户在选择知识库、上传文档、进行问答时就容易混乱。
因此,新增和修改知识库时都需要判断名称是否重复。
八、分层结构的好处
Day07 最明显能感受到后端分层的好处。
Day06 使用的是内存版 Repository:
InMemoryKnowledgeBaseRepository
Day07 新增的是 MySQL 版 Repository:
JdbcKnowledgeBaseRepository
但是 Controller 和 Service 的整体结构没有大改。
也就是说:
接口层基本不变
业务层只增加校验
数据访问层替换实现
这说明分层设计是有意义的。
如果一开始把所有 SQL、业务逻辑、接口代码都写在 Controller 里面,后面想从内存版改成 MySQL 版,就会很混乱。
网硕互联帮助中心




评论前必须登录!
注册