当前位置: 首页 > news >正文

山东大学软件学院创新实训开发日志1-数据库选型

本周我主要针对数据库选型做了研究工作。首先看我们的业务需要:不仅包括账密登录、用户信息这些结构化数据,还包括非结构化数据(如:带有 ABCD 选项的单选题、长文本解析、错题本),之后还需要做RAG增强检索、构建知识图谱、接入大模型实现智能答疑等。此前的课程设计经验中比较熟悉的是MySQL,但如果无脑MySQL注定会在后期的 AI 接入和复杂查询中遭遇严重的性能瓶颈和架构重构,众所周知,错误发现的越迟,纠正错误的成本越高,于是我首先谨慎地对数据库选型做了一些研究。

一、关系型数据库选型

为了实现用户信息存储、做题记录等业务逻辑,我们首先需要一个关系型数据库。在参考了一些技术博客和github上的项目之后,准备在PostgreSQL和MySQL中二选一。一开始准备用PostgreSQL,主要是因为之后要做RAG,需要用到向量检索,而Postgre有个扩展插件pgvector可以支持我们对于向量数据库的需求。但之后发现pgvector来单独当作一个向量数据库还是有不妥(详见下文),于是转入单纯比较Postgre和MySQL。

1.首先由于我们要存储408题库,对于选择题的答案存储其实是非结构化的。Postgre和MySQL都能支持json格式,下图是MySQL数据类型选择页面:

json格式极大程度上满足了我们的需求,不同点在于MySQL对于json格式的数据操作功能比较有限,主要是可以提取、更新json数据中的值,例如 JSON_EXTRACT() 函数可以提取json文档中指定路径的值,JSON_SET() 函数可以更新json文档中的值;而Postgre则提供了更强大的处理功能,不过实际业务上MySQL针对json数据的操作已经够用了。

2.其次在使用成本上,MySQL相对Postgre架构更简单,使用起来更容易上手,而且我们团队也比较熟悉;Postgre虽然有众多的特性和功能,但需要具备更高的技术水平和经验,而且配置参数多,对服务器硬件资源(比如内存、CPU)要求可能更高,它的使用场景是地理信息系(GIS)、企业资源规划(ERP)、金融系统等这些对复杂查询、数据一致性有高要求的企业级应用。

3.综合考量之下,最终还是选择了MySQL。

二、向量数据库

主要是pgvector和ChromaDB的二选一。我们使用向量数据库主要是为了实现RAG。

1.pgvector是Postgre的插件,如果使用它的话可以省去维护两个独立数据库可能造成数据不一致风险等麻烦。但仔细阅读技术博客后发现,pgvector其实不能看作一个独立的向量数据库,它只是把向量当作了一种字段类型,让向量检索融入了SQL体系,它更适合做带负责业务条件的语义检索。pgvector做的是内容检索,一个内容检索系统通常至少包含向量、状态过滤、分类、排序、分页等,​​它把搜索逻辑转到了应用层,我们要在应用层写if/for代码,造成代码复杂、难以维护等,根本不适合做纯向量数据库。

2.而Chroma是向量数据库,它是为RAG(检索增强生成)而生的!Chroma更适合RAG/LLM问答、纯语义召回这些场景,而且查询模式非常简单(TopK)。这与我们的任务目标完全匹配。

3.综上所述,我们选择了ChromaDB。说回前面,Postgre显然就失去了当初考虑它的最大优势。

三、缓存

对于408历年经典必考真题,短时间内会有大量重复查询。引入Redis可以将这些高频数据的读取从磁盘 I/O 转移到内存,极大减轻MySQL 的压力。缓存选择了Redis。但过早优化是大忌,所以打算前期先不用Redis,待到项目中后期再引入。

四、图数据库

后续计划构建408知识图谱,需要引入图数据库,将知识点作为节点(Nodes),将依赖关系作为边(Relationships)。这里选择了经典图数据库Neo4j。

http://www.cnnetsun.cn/news/1868632.html

相关文章:

  • RestTemplate HTTPS请求中PKIX路径构建失败的深度解析与解决方案
  • DotNetPy:现代.NET 与 Python 互操作 实战指南吃
  • 告别杂乱:用ContextMenuManager重塑Windows右键菜单新秩序
  • DeepSeek-OCR-2入门实战:从零开始,搭建你的第一个OCR应用
  • 2026终极指南:三分钟掌握B站资源高效下载神器BiliTools
  • Phi-3 Forest Lab部署教程:添加模型响应质量评分与人工反馈闭环
  • 从零到实战:在Vivado里用国产BR3109芯片搭建JESD204B收发链路(FPGA篇)
  • C语言入门——篇一
  • 为什么你的AIAgent集群总在凌晨崩?曝光3个未公开的分布式时钟漂移陷阱及纳秒级同步修复法
  • 基于Pixel Epic · Wisdom Terminal的智能体(Agent)架构设计:从理论到Dify实践
  • 我用两大插件,盘活了上千条 Obsidian 笔记
  • AMD GPU本地AI部署革命:ollama-for-amd实现高性能大语言模型运行指南
  • AudioSeal保姆级教程:从ffmpeg预处理到CUDA加速检测完整步骤
  • ChatTTS开发者指南:API接口调用与二次开发说明
  • 一文学习 工作流开发 BPMN、 Flowable字
  • Vue3—Win7系统下Node.js版本降级与升级的兼容性环境搭建
  • 乙巳马年春联生成终端环境部署:HTTPS证书自动签发与更新
  • 打字不如说话,说话不如截图——AI 代码助手的多模态输入实践粮
  • 为什么92%的AIAgent在真实场景中语义崩溃?2026奇点大会首次公开3类隐性歧义消解协议
  • Qt 树模型(Tree Model)的增删改查实战解析
  • [精品]基于微信小程序的农产品交易平台惠农助农农产品销售商城 UniApp
  • 千问3.5-2B一键部署与运维监控实战教程
  • FLUX.1-dev FP8量化模型:面向低显存环境的AI图像生成解决方案技术解析
  • 肖特基二极管
  • CPU主要组成部分
  • YooAsset 2.2.12:Unity跨平台资源管理的技术突破与实践指南
  • 单电源差分音频转单端音频的电路设计与实现
  • 机械设计师必备:SOLIDWORKS工程图10个高效冷技巧(隐藏线/断裂视图/形位公差)
  • 解决Android容器化测试难题:Docker-Android架构深度解析与生产实践指南
  • 文本转CAD工具:用一句话生成3D机械设计,彻底改变工程师工作方式