关系型数据库与向量数据库详解

全面解析两种数据库的特点、区别和应用场景


目录


 📊关系型数据库 (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)

优势

  • 发现潜在的关联

  • 跨类别推荐

  • 个性化程度高


🚀 未来趋势

融合趋势

  1. 关系型数据库增加向量支持

    • PostgreSQL + pgvector 插件

    • MySQL 8.0+ 支持 JSON 和向量操作

    • Oracle 23c 支持 AI 向量

  2. 向量数据库增加关系特性

    • 支持元数据过滤

    • 支持简单的事务

    • 支持 SQL 查询接口

  3. 混合数据库系统

    • 单一数据库同时支持关系和向量

    • 统一查询接口

    • 自动优化查询计划

技术发展方向

方向

关系型数据库

向量数据库

AI 集成

内置机器学习模型

更强的嵌入模型支持

实时性

流式数据处理

实时向量更新

多模态

支持多种数据类型

文本 + 图片 + 音频联合搜索

云原生

云数据库服务

托管向量数据库服务

边缘计算

轻量级嵌入

边缘向量搜索


📝 总结

核心要点

方面

关系型数据库

向量数据库

本质

结构化数据的管家

非结构化数据的专家

优势

精确、可靠、事务

智能、语义、推荐

查询

"找相同的"

"找相似的"

适用

业务系统

AI 应用

关键结论

  1. 不是替代关系,而是互补关系

    • 各有优势,相互补充

    • 现代应用常同时使用

  2. 根据场景选择

    • 结构化数据 + 事务 → 关系型

    • 非结构化数据 + 语义 → 向量型

  3. 混合架构是趋势

    • 发挥各自优势

    • 提供更强大的功能

最佳实践

选择合适的数据库 = 理解业务需求 + 了解技术特点

✅ 不要试图用一种数据库解决所有问题
✅ 根据数据特点选择存储方式
✅ 考虑未来扩展性和维护成本
✅ 充分利用现有技术和工具

 扩展阅读

关系型数据库

向量数据库

AI 与嵌入

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐