正常来说,Postgres是关系型数据库,它里面的插件pgvector可以做向量相似度检索,一般就将Postgres + pgvector 充当向量数据库,既然postgres既能做关系型数据库的事情,又能做向量数据库的事情,为什么还要用mogodb?
从技术角度看使用 Postgres+pgvector 完全可以搞定全部,MongoDB 不是必需品。 用 Mongo 不是因为 PG 做不到,是业务读写特点 + 架构取舍 带来的选择,很多开源项目这么做,是为了拆分负载、隔离数据,不是硬性要求。
PG 能干啥
Postgres + pgvector:
- ✅ 关系能力:表、主键、外键、事务、JSONB
- ✅ 向量能力:向量相似度检索(RAG 核心召回)
你可以:向量、文档元信息、聊天记录全部存在 PG,小项目这么写是最优最简单方案。
为什么很多 RAG 项目还要带上 MongoDB?
核心的原因有三个:
1. 负载隔离(最重要)
向量检索CPU 开销很高,是 RAG 最核心、最不能卡的接口。
- 如果你把频繁写入的聊天记录、文件上传记录 全部放在同一个 PG 实例: 用户每一轮对话、每次上传文件,都会大量 INSERT/UPDATE,会和向量查询争抢 CPU、IO。 高峰期,向量检索会变慢,问答变卡。
分开之后:
- PG:只承载向量检索、文档切片(读重,计算重)
- Mongo:承载聊天记录、文件元数据(大量追加写入,结构多变)
两个库独立资源,聊天记录疯狂写入,不会拖累向量检索性能。
👉 但是!本地开发、小体量知识库,根本感受不到这个压力,属于 "预留给大并发生产环境" 的设计。
2. 数据形态的偏好:频繁变更的松散结构
聊天记录、文档元数据经常要新增字段: 比如今天加feedback用户点赞,明天加agent_plugins插件信息,后天加trace日志。
- Mongo:文档型,直接新增字段,不用改表结构,零成本。
- PG:JSONB 虽然也能存动态字段,但如果业务规范强,一般会尽量设计成固定表;如果大量字段随意增减,开发习惯上不如 Mongo 顺手。
⚠️ 注意:这是开发习惯,不是 PG 做不到。PG 的 JSONB 很强。
3. 故障域隔离
- 如果 Mongo 挂了:向量检索还能跑,问答可以继续,只是看不到历史对话 / 文件列表
- 如果 PG 挂了:整个知识库召回直接失效,问答完全不可用
核心逻辑:把系统最核心的向量能力单独保护起来,不要被非核心数据的故障影响。
✅ 两种架构对比,帮你选
架构 A:单库 Postgres + pgvector(推荐你本地开发)
没有 Mongo,最简单,少维护一个容器
- 向量切片、文件元信息、对话记录,全部放在 PG ✅ 优点:部署简单,少一个组件,调试方便,个人项目足够 ❌ 缺点:高并发、百万级文档时,数据库压力混杂在一起
架构 B:PG+pgvector + MongoDB(大型企业项目)
开源项目常用,面向未来可能扩容到生产 ✅ 优点:读写负载隔离,海量对话写入不影响向量检索;松散文档字段改动方便;故障隔离 ❌ 缺点:组件变多,维护更麻烦,本地开发属于 "过度设计"
什么时候没必要加 Mongo?
- 本地测试、个人知识库、文档量不大、没有大量并发聊天 👉 直接去掉 Mongo,只用 Postgres+pgvector,完全够用,不损失核心 RAG 功能
总结
Postgres + pgvector 本身就是全能选手 ,既能存结构化数据,又能做向量检索。 MongoDB 是加分的分离方案,不是 RAG 知识库的必备组件。