从 0 到 1 理解数据库: 关系型与向量型数据库的完整对比指南
关系型数据库与向量数据库详解
全面解析两种数据库的特点、区别和应用场景
目录
📊关系型数据库 (Relational Database)
定义
关系型数据库是一种基于关系模型的数据库,使用表格来组织和存储数据,表格之间可以通过关系进行关联。它遵循ACID原则,保证数据的一致性和可靠性。
核心概念
1. 表 (Table)
-
数据的基本存储单位
-
由行(记录)和列(字段)组成
-
例如:学生表、课程表
2. 行 (Row/Record)
-
表中的一条记录
-
代表一个完整的实体
-
例如:一个学生的所有信息
3. 列 (Column/Field)
-
表中的一个属性
-
定义数据类型
-
例如:姓名、年龄、学号
4. 主键 (Primary Key)
-
唯一标识一条记录的字段
-
不能为空,不能重复
-
例如:学号
5. 外键 (Foreign Key)
-
用于建立表与表之间的关系
-
引用另一个表的主键
-
例如:选课表中的学号引用学生表
数据结构示例
┌──────────────────────────────────────┐
│ 关系型数据库 │
├──────────────────────────────────────┤
│ 学生表 (students) │
│ ┌────┬──────┬────┬────────── │
│ │学号│ 姓名 │年龄│ 班级 │ │
│ ├────┼──────┼────┼────────── │
│ │001 │张三 │ 18 │ 计算机 1 班│ │
│ │002 │李四 │ 19 │ 计算机 2 班│ │
│ └────┴──────┴────┴──────────┘ │
│ │
│ 课程表 (courses) │
│ ┌────┬──────────┬──────┐ │
│ │课号│ 课程名称 │ 学分 │ │
│ ├────┼──────────┼──────┤ │
│ │C01 │ Java 编程 │ 4 │ │
│ │C02 │ 数据库原理│ 3 │ │
│ └────┴──────────┴──────┘ │
│ │
│ 选课表 (enrollments) │
│ ┌────┬────┬──────┐ │
│ │学号│课号│ 成绩 │ │
│ ├────┼────┼────── │
│ │001 │C01│ 95 │ │
│ │002 │C02│ 88 │ │
│ └────┴────┴──────┘ │
└──────────────────────────────────────┘
SQL 查询示例
-- 查询所有学生的信息
SELECT * FROM students;
-- 查询张三的选课情况
SELECT s.姓名,c.课程名称,e.成绩
FROM students s
JOIN enrollments e ON s.学号 = e.学号
JOIN courses c ON e.课号 = c.课号
WHERE s.姓名 = '张三';
-- 统计每门课程的平均成绩
SELECT c.课程名称,AVG(e.成绩) as 平均分
FROM courses c
JOIN enrollments e ON c.课号 = e.课号
GROUP BY c.课号,c.课程名称;
ACID 特性
|
特性 |
说明 |
例子 |
|---|---|---|
|
原子性 (Atomicity) |
事务是不可分割的最小单位 |
转账要么全部成功,要么全部失败 |
|
一致性 (Consistency) |
事务执行前后数据保持一致 |
转账前后总金额不变 |
|
隔离性 (Isolation) |
多个事务互不干扰 |
并发转账不会相互影响 |
|
持久性 (Durability) |
事务提交后永久保存 |
即使断电,数据不丢失 |
常见关系型数据库
|
数据库 |
厂商 |
特点 |
|---|---|---|
|
MySQL |
Oracle |
开源、流行、性能好 |
|
PostgreSQL |
社区 |
功能强大、支持 JSON |
|
Oracle |
Oracle |
企业级、功能最全 |
|
SQL Server |
Microsoft |
与 Windows 集成好 |
|
MariaDB |
社区 |
MySQL 的分支、完全开源 |
特点总结
✅ 结构化存储:数据按表格形式组织
✅ 强一致性:ACID 事务保证
✅ 成熟稳定:几十年发展历史
✅ 生态完善:工具、框架丰富
✅ 精确查询:适合确定性查询
❌ 扩展性差:水平扩展困难
❌ 非结构化数据支持弱:不适合存储文本、图片等
❌ 语义搜索能力弱:只能关键词匹配
🧠 向量数据库 (Vector Database)
定义
向量数据库是一种专门用于存储、管理和查询高维向量的数据库。它将数据对象(文本、图片、音频等)转换为数值向量(嵌入向量),通过计算向量之间的相似度来实现语义搜索和推荐。
核心概念
1. 向量 (Vector)
-
一组数值,表示数据的特征
-
维度从几十到几千不等
-
例如:
[0.1, 0.5, -0.3, ..., 0.8]
2. 嵌入 (Embedding)
-
将非结构化数据转换为向量的过程
-
使用 AI 模型(如 BERT、ResNet)
-
保留语义信息
文本:"中医药治疗感冒"
↓ (AI 模型编码)
向量:[0.12, -0.45, 0.78, 0.33, ..., -0.21]
3. 相似度 (Similarity)
-
衡量向量之间的接近程度
-
常用度量方法:
|
度量方法 |
公式 |
适用场景 |
|---|---|---|
|
余弦相似度 |
cos(θ) = A·B / (‖A‖B‖) |
文本相似度 |
|
欧氏距离 |
√(Σ(aᵢ-bᵢ)²) |
空间距离 |
|
点积 |
A·B = Σaᵢbᵢ |
推荐系统 |
4. 近似最近邻搜索 (ANN)
-
快速找到最相似的向量
-
牺牲少量精度换取速度
-
常用算法:HNSW、IVF、LSH
工作原理
┌─────────────────────────────────────────────────┐
│ 向量数据库工作流程 │
└─────────────────────────────────────────────────┘
数据入库:
文本/图片 → AI 模型 → 向量 → 存储到向量数据库
查询流程:
查询语句 → AI 模型 → 查询向量 → 相似度搜索 → 返回结果
示例:
"治疗风热感冒的药方"
↓ 编码
[0.15, -0.42, 0.75, ..., 0.30]
↓ 相似度搜索
[
{药方:"银翘解毒片", 相似度:0.98},
{药方:"感冒灵颗粒", 相似度:0.95},
{药方:"板蓝根颗粒", 相似度:0.92}
]
向量数据库结构
┌─────────────────────────────────────────┐
│ 向量数据库 │
├─────────────────────────────────────────┤
│ 向量集合 (collection) │
│ ┌────┬─────────────────────┬──────┐ │
│ │ ID │ 向量 │元数据│ │
│ ├────┼─────────────────────┼──────┤ │
│ │ 1 │[0.12,-0.45,0.78...]│药方 1│ │
│ │ 2 │[0.15,-0.42,0.75...]│药方 2│ │
│ │ 3 │[-0.23,0.67,0.12...]│药方 3│ │
│ └────┴─────────────────────┴──────┘ │
│ │
│ 索引:HNSW 图索引 │
│ 距离度量:余弦相似度 │
│ 维度:768 维 │
└─────────────────────────────────────────┘
查询示例(Python 伪代码)
from sentence_transformers import SentenceTransformer
# 1. 加载嵌入模型
model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
# 2. 将查询转换为向量
query_vector = model.encode("治疗风热感冒的药方")
# 3. 在向量数据库中搜索
results = vector_db.search(
query_vector=query_vector,
top_k=5, # 返回最相似的 5 个
filter={"category": "感冒药"} # 元数据过滤
)
# 4. 处理结果
for result in results:
print(f"药名:{result.metadata['name']}, 相似度:{result.score}")
# 输出:
# 药名:银翘解毒片,相似度:0.98
# 药名:感冒灵颗粒,相似度:0.95
# 药名:板蓝根颗粒,相似度:0.92
常见向量数据库
|
数据库 |
特点 |
适用场景 |
|---|---|---|
|
Milvus |
开源、功能强大 |
大规模向量搜索 |
|
Pinecone |
托管服务、易用 |
快速原型开发 |
|
Weaviate |
支持 GraphQL |
语义搜索 |
|
Chroma |
轻量级、本地优先 |
小型项目 |
|
Qdrant |
Rust 编写、性能好 |
高性能场景 |
|
FAISS |
Facebook 开源库 |
研究实验 |
特点总结
✅ 语义理解:理解查询的真实含义
✅ 高维向量:专为 AI 嵌入向量优化
✅ 相似度搜索:找到"相似"而非"相同"
✅ AI 友好:与机器学习模型无缝集成
✅ 水平扩展:适合大规模数据
❌ 不支持事务:无法保证 ACID
❌ 一致性较弱:通常是最终一致性
❌ 不适合结构化数据:管理关系数据能力弱
❌ 生态系统较新:工具和文档不如关系型数据库完善
🆚 核心区别对比
全面对比表
|
特性维度 |
关系型数据库 |
向量数据库 |
|---|---|---|
|
数据类型 |
结构化数据(表格) |
高维向量(嵌入) |
|
数据模型 |
关系模型 |
向量空间模型 |
|
查询语言 |
SQL |
API / RESTful |
|
查询方式 |
精确匹配查询 |
相似度搜索 |
|
索引类型 |
B+ 树、哈希索引 |
HNSW、IVF、LSH |
|
搜索能力 |
关键词匹配 |
语义相似度 |
|
一致性 |
强一致性(ACID) |
最终一致性 |
|
事务支持 |
完整支持 |
不支持或弱支持 |
|
扩展性 |
垂直扩展为主 |
水平扩展友好 |
|
数据模式 |
严格 Schema |
灵活 Schema |
|
适用场景 |
业务系统、交易记录 |
AI 应用、推荐系统 |
|
典型代表 |
MySQL, PostgreSQL |
Milvus, Pinecone |
查询方式对比
关系型数据库查询
-- 精确查询
SELECT * FROM medicines WHERE name = '感冒灵颗粒';
-- 模糊查询
SELECT * FROM medicines WHERE name LIKE '%感冒%';
-- 条件查询
SELECT * FROM medicines WHERE category = '感冒药' AND price < 30;
特点:
-
基于关键词匹配
-
无法理解语义
-
结果要么匹配,要么不匹配
向量数据库查询
# 语义查询
query = "头疼发烧吃什么药?"
results = search(query, top_k=5)
# 返回语义相关的结果,即使不包含"头疼"、"发烧"关键词
# 可能返回:感冒灵颗粒、银翘解毒片等
特点:
-
基于语义理解
-
结果按相似度排序
-
能理解查询的真实意图
性能对比
|
操作 |
关系型数据库 |
向量数据库 |
|---|---|---|
|
精确查找 |
⚡⚡ 极快 (O(log n)) |
⚡ 快 |
|
范围查询 |
⚡⚡⚡ 极快 |
⚡ 慢 |
|
相似度搜索 |
⚡ 极慢 (O(n)) |
⚡⚡⚡ 极快 (O(log n)) |
|
JOIN 操作 |
⚡⚡ 优化良好 |
不支持 |
|
聚合统计 |
⚡⚡⚡ 强大 |
⚡ 基础支持 |
|
写入性能 |
⚡⚡ 好 |
⚡⚡ 极好 |
应用场景对比
关系型数据库的典型应用
1. 银行系统
-
✅ 账户管理
-
✅ 转账交易
-
✅ 账单记录
-
✅ 需要强一致性和事务支持
2. 电商系统
-
✅ 订单管理
-
✅ 库存管理
-
✅ 用户信息管理
-
✅ 支付结算
3. 企业 ERP
-
✅ 财务管理
-
✅ 人力资源
-
✅ 供应链管理
-
✅ 报表统计
4. 您的中医药系统
-
✅ 中成药信息管理
-
✅ 中药材信息管理
-
✅ 配伍关系管理
-
✅ 分类查询和统计
-- 查询某个中成药的所有成分
SELECT m.medicine_name, i.ingredient_name, mi.dosage, mi.role
FROM medicine_names m
JOIN medicine_ingredients mi ON m.id = mi.medicine_id
JOIN ingredients i ON mi.ingredient_id = i.id
WHERE m.medicine_name = '感冒灵颗粒';
向量数据库的典型应用
1. 智能搜索
-
✅ 语义搜索引擎
-
✅ 文档检索
-
✅ 知识库问答
# 用户提问:"感冒了吃什么药好?"
# 系统理解语义,返回相关药方,即使药方描述中没有"感冒"二字
2. 推荐系统
-
✅ 个性化推荐
-
✅ 相似商品推荐
-
✅ 内容推荐
# 用户浏览了"感冒灵颗粒"
# 推荐语义相似的其他感冒药
similar_medicines = find_similar("感冒灵颗粒", top_k=5)
3. AI 应用
-
✅ RAG(检索增强生成)
-
✅ 智能客服
-
✅ 对话系统
4. 多媒体搜索
-
✅ 以图搜图
-
✅ 语音搜索
-
✅ 视频检索
如何选择
选择关系型数据库的场景
✅ 需要存储结构化数据
-
数据有明确的字段和类型
-
例如:用户信息、订单记录
✅ 需要事务支持(ACID)
-
数据一致性要求高
-
例如:银行转账、库存扣减
✅ 需要复杂查询和报表
-
多表关联查询
-
聚合统计和分析
✅ 精确匹配查询
-
查找特定的记录
-
条件过滤
✅ 成熟的生态系统
-
需要丰富的工具和框架支持
选择向量数据库的场景
✅ 需要语义搜索
-
理解查询的真实含义
-
例如:智能问答系统
✅ 处理非结构化数据
-
文本、图片、音频、视频
-
例如:文档检索、图片搜索
✅ 需要 AI/ML 集成
-
与机器学习模型配合
-
例如:推荐系统、RAG
✅ 相似度匹配场景
-
查找相似的内容
-
例如:相似商品、相似文档
✅ 高并发查询
-
需要快速响应
-
例如:实时推荐
决策树
开始
│
├─ 需要事务支持?──是──→ 关系型数据库
│
├─ 数据结构化?──是──→ 关系型数据库
│
├─ 需要语义搜索?──是──→ 向量数据库
│
├─ 处理非结构化数据?──是──→ 向量数据库
│
└─ 都不确定?──→ 两者结合使用
💡 最佳实践:混合架构
典型架构
┌─────────────────────────────────────┐
│ 应用系统 │
├─────────────────────────────────────┤
│ 用户管理 → MySQL │
│ 订单管理 → MySQL │
│ 商品搜索 → 向量数据库 │
│ 智能推荐 → 向量数据库 │
│ 数据分析 → MySQL + 向量数据库 │
└─────────────────────────────────────┘
电商系统示例
┌──────────────────────────────────────┐
│ 电商平台 │
├──────────────────────────────────────┤
│ MySQL 存储: │
│ - 用户信息 (users) │
│ - 订单记录 (orders) │
│ - 商品库存 (inventory) │
│ - 交易记录 (transactions) │
│ │
│ 向量数据库存储: │
│ - 商品嵌入向量 (product embeddings) │
│ - 用户偏好向量 (user preferences) │
│ - 评论情感向量 (review embeddings) │
│ │
│ 功能: │
│ - 语义搜索商品 │
│ - 个性化推荐 │
│ - 相似商品推荐 │
│ - 以图搜图 │
└──────────────────────────────────────┘
中医药系统增强方案
┌──────────────────────────────────────┐
│ 中医药管理系统(增强版) │
├──────────────────────────────────────┤
│ MySQL (现有): │
│ - 中成药信息 │
│ - 中药材信息 │
│ - 配伍关系 │
│ - 分类和统计 │
│ │
│ 向量数据库 (可选增强): │
│ - 药方功效嵌入向量 │
│ - 症状描述嵌入向量 │
│ - 中药材特性向量 │
│ │
│ 新增功能: │
│ - 症状智能推荐药方 │
│ - 相似药方检索 │
│ - 中药方剂相似度分析 │
│ - 自然语言查询药方 │
└──────────────────────────────────────┘
实现示例
# 用户输入症状描述
symptoms = "最近天气变化大,有点头疼、发烧、嗓子疼"
# 1. 将症状转换为向量
symptom_vector = embedding_model.encode(symptoms)
# 2. 在向量数据库中搜索相似药方
results = vector_db.search(
query_vector=symptom_vector,
top_k=5,
filter={"category": "感冒药"}
)
# 3. 从 MySQL 获取详细药方信息
for result in results:
medicine_id = result.metadata['medicine_id']
medicine_details = mysql.query(
"SELECT * FROM medicine_names WHERE id = ?",
[medicine_id]
)
print(f"推荐药方:{medicine_details['medicine_name']}")
print(f"匹配度:{result.score * 100:.1f}%")
📊 实际案例对比
案例 1:搜索功能
需求:用户搜索"治疗头疼的药"
关系型数据库方案
SELECT * FROM medicines
WHERE name LIKE '%头疼%'
OR main_effects LIKE '%头疼%';
结果:
-
✅ 找到名称或功效中包含"头疼"的药
-
❌ 找不到描述为"缓解头痛"但没写"头疼"的药
-
❌ 找不到治疗"偏头痛"的药
向量数据库方案
query_vector = encode("治疗头疼的药")
results = search_similar(query_vector, top_k=10)
结果:
-
✅ 找到所有治疗头疼相关的药
-
✅ 包括"头痛"、"偏头痛"、"头昏"等相关描述
-
✅ 按语义相关度排序
案例 2:推荐系统
需求:根据用户浏览历史推荐药品
关系型数据库方案
-- 基于类别的推荐
SELECT * FROM medicines
WHERE category = (
SELECT category FROM medicines WHERE id = ?
)
AND id != ?
LIMIT 10;
问题:
-
只能推荐同一类别的药
-
无法发现跨类别的关联
向量数据库方案
# 基于向量相似度推荐
user_vector = calculate_user_preference(user_history)
recommendations = find_similar_medicines(user_vector, top_k=10)
优势:
-
发现潜在的关联
-
跨类别推荐
-
个性化程度高
🚀 未来趋势
融合趋势
-
关系型数据库增加向量支持
-
PostgreSQL + pgvector 插件
-
MySQL 8.0+ 支持 JSON 和向量操作
-
Oracle 23c 支持 AI 向量
-
-
向量数据库增加关系特性
-
支持元数据过滤
-
支持简单的事务
-
支持 SQL 查询接口
-
-
混合数据库系统
-
单一数据库同时支持关系和向量
-
统一查询接口
-
自动优化查询计划
-
技术发展方向
|
方向 |
关系型数据库 |
向量数据库 |
|---|---|---|
|
AI 集成 |
内置机器学习模型 |
更强的嵌入模型支持 |
|
实时性 |
流式数据处理 |
实时向量更新 |
|
多模态 |
支持多种数据类型 |
文本 + 图片 + 音频联合搜索 |
|
云原生 |
云数据库服务 |
托管向量数据库服务 |
|
边缘计算 |
轻量级嵌入 |
边缘向量搜索 |
📝 总结
核心要点
|
方面 |
关系型数据库 |
向量数据库 |
|---|---|---|
|
本质 |
结构化数据的管家 |
非结构化数据的专家 |
|
优势 |
精确、可靠、事务 |
智能、语义、推荐 |
|
查询 |
"找相同的" |
"找相似的" |
|
适用 |
业务系统 |
AI 应用 |
关键结论
-
不是替代关系,而是互补关系
-
各有优势,相互补充
-
现代应用常同时使用
-
-
根据场景选择
-
结构化数据 + 事务 → 关系型
-
非结构化数据 + 语义 → 向量型
-
-
混合架构是趋势
-
发挥各自优势
-
提供更强大的功能
-
最佳实践
选择合适的数据库 = 理解业务需求 + 了解技术特点
✅ 不要试图用一种数据库解决所有问题
✅ 根据数据特点选择存储方式
✅ 考虑未来扩展性和维护成本
✅ 充分利用现有技术和工具
扩展阅读
关系型数据库
-
《高性能 MySQL》
-
《数据库系统概念》
向量数据库
-
《向量搜索入门指南》
-
《深度学习中的嵌入表示》
AI 与嵌入
-
《自然语言处理入门》
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)