SurrealDB - 统一数据基础设施

什么是 SurrealDB?

SurrealDB 是一款多模型数据库,使用 Rust 开发,支持文档、图、向量、时间序列、地理空间和关系模型。它通过统一的架构整合多种数据存储需求,简化开发流程。

核心功能

  • 多模型支持:单一平台处理多种数据类型,减少维护多个数据库的复杂性。
  • SurrealQL 查询语言:类似 SQL,支持图遍历、向量搜索和全文索引,适合复杂查询。
  • 灵活部署:支持从边缘设备到云端集群,兼容 Docker、Kubernetes 和主流云平台。
  • 实时性:内置事件流和 LIVE 查询,适合实时应用。
  • AI 集成:支持向量搜索和 GraphRAG,适配生成式 AI 和知识图谱场景。

SurrealDB 提供统一的存储和查询接口,适合需要多种数据模型的现代应用。

SurrealDB 与 Neo4j 的对比

Neo4j 是专注于图数据库的工具,以 Cypher 语言处理复杂关系数据。SurrealDB 则通过多模型支持提供更广泛的适用性。以下是两者的对比:

维度 SurrealDB Neo4j
数据模型 文档、图、向量等多种模型 仅图模型
查询语言 SurrealQL(SQL-like,支持多模型) Cypher(专为图设计)
扩展性 无分片,支持 PB 级扩展 需要分片,复杂查询可能受限
实时性 原生支持事件流和 LIVE 查询 需额外插件实现
性能 Rust 开发,高并发低延迟 Java 开发,资源占用较高
AI 支持 内置向量搜索和 GraphRAG 需外部工具(如 APOC)

优势分析

  • 多功能性:SurrealDB 支持多种数据模型,减少多数据库集成成本;Neo4j 专注图场景,适合深度图遍历。
  • 成本与效率:SurrealDB 的统一架构降低运维开销,Rust 实现提供高性能;Neo4j 在复杂图场景下表现稳定,但资源消耗较高。
  • 适用场景:SurrealDB 适合混合数据需求(如 AI + 图 + 文档);Neo4j 更适合纯图应用,如社交网络分析。

选择 SurrealDB 可简化架构,Neo4j 则在图数据库领域有深厚积累。

SurrealDB CRUD 操作示例

以下通过 SurrealQL 展示 CRUD 操作,基于一个 person 表(包含 name、skills、company 字段)。假设 SurrealDB 已启动(surreal start --user root --pass root)并通过 Web UI 或 SDK 连接。

CREATE:创建记录

添加新记录,支持随机或指定 ID。

sql 复制代码
-- 创建随机 ID 记录
CREATE person;
-- 输出: [{"id": "person:random_id"}]

-- 指定 ID 并设置字段
CREATE person:tobie SET
    name = 'Tobie',
    company = 'SurrealDB',
    skills = ['Rust', 'Go', 'JavaScript'];

-- 使用 CONTENT 语法
CREATE person:jaime CONTENT {
    name: 'Jaime',
    company = 'xAI',
    skills: ['Python', 'AI']
};

READ (SELECT):查询记录

支持字段选择、过滤和图遍历。

sql 复制代码
-- 查询所有记录
SELECT * FROM person;

-- 查询特定字段
SELECT name, skills FROM person:tobie;

-- 条件查询
SELECT name, array::distinct(skills) FROM person
WHERE company = 'SurrealDB';

-- 图遍历:查询朋友关系
SELECT ->knows->person.name AS friends FROM person:tobie;

UPDATE:更新记录

支持增量修改和条件更新。

sql 复制代码
-- 更新特定记录
UPDATE person:tobie SET skills += 'System Design';

-- 条件更新
UPDATE person SET skills += 'AI' WHERE company != 'SurrealDB';

-- 合并对象
UPDATE person:tobie MERGE {
    settings: { marketing: true }
};

DELETE:删除记录

支持条件删除和图边删除。

sql 复制代码
-- 删除特定记录
DELETE person:tobie;

-- 条件删除
DELETE person WHERE company = 'xAI';

-- 删除图边
DELETE person:tobie->knows WHERE out = person:jaime;

向量数据操作示例

SurrealDB 支持向量数据,用于相似性搜索等 AI 场景。以下基于一个 embedding 表(包含 vector 字段)展示操作。向量字段存储数值数组,如嵌入。

首先,定义索引(可选,用于优化搜索):

sql 复制代码
DEFINE INDEX vec_idx ON embedding FIELDS vector M-TREE DIMENSION 3 DIST EUCLIDEAN;

CREATE:创建向量记录

ini 复制代码
CREATE embedding:1 SET vector = [0.1, 0.2, 0.3];

CREATE embedding:2 CONTENT {
    vector: [0.4, 0.5, 0.6],
    description: 'Sample vector'
};

READ (SELECT):查询向量记录,包括相似性搜索

使用向量函数进行相似度计算,如余弦相似度。

sql 复制代码
-- 查询所有向量
SELECT * FROM embedding;

-- 相似性搜索
SELECT *, vector::similarity::cosine(vector, [0.1, 0.2, 0.3]) AS score 
FROM embedding 
ORDER BY score DESC 
LIMIT 5;

其他相似度函数示例:

sql 复制代码
SELECT vector::similarity::jaccard([1, 2, 3], [1, 2, 4]) AS jaccard_score;
-- 输出: 0.5

UPDATE:更新向量

sql 复制代码
UPDATE embedding:1 SET vector = [0.7, 0.8, 0.9];

DELETE:删除向量记录

sql 复制代码
DELETE embedding WHERE vector::magnitude(vector) > 1.0;

文档数据操作示例

SurrealDB 支持文档模型,允许存储嵌套 JSON-like 结构。以下基于 users 表展示,包含嵌套地址数组。

CREATE:创建文档

sql 复制代码
CREATE users CONTENT {
    name: "Alice Smith",
    email: "alice@example.com",
    age: 29,
    addresses: [
        {
            type: "home",
            address_line: "123 Maple St",
            city: "Springfield",
            country: "USA"
        },
        {
            type: "work",
            address_line: "456 Oak Ave",
            city: "Metropolis",
            country: "USA"
        }
    ]
};

READ (SELECT):查询文档

sql 复制代码
-- 查询所有文档
SELECT * FROM users;

-- 查询特定字段,包括嵌套
SELECT name, addresses[0].city AS home_city FROM users;

UPDATE:更新文档

sql 复制代码
UPDATE users SET age = 30, addresses += { type: "vacation", address_line: "789 Beach Rd", city: "Miami", country: "USA" } 
WHERE email = "alice@example.com";

DELETE:删除文档

sql 复制代码
DELETE users WHERE age > 50;

总结

SurrealDB 通过多模型支持和灵活的 SurrealQL,简化了现代应用的开发流程。对比 Neo4j,其统一架构和高性能使其在混合数据场景中更具优势。

相关推荐
自由的疯2 小时前
Java(32位)基于JNative的DLL函数调用方法
java·后端·架构
longlongago~~2 小时前
富文本编辑器Tinymce的使用、行内富文本编辑器工具栏自定义class、katex渲染数学公式
前端·javascript·vue.js
2501_915921432 小时前
前端用什么开发工具?常用前端开发工具推荐与不同阶段的选择指南
android·前端·ios·小程序·uni-app·iphone·webview
回家路上绕了弯2 小时前
深入理解 RabbitMQ:从核心概念到实战应用
后端·消息队列
自由的疯2 小时前
Java 使用Jackson进行深拷贝:优化与最佳实践
java·后端·架构
aixfe2 小时前
BiomeJS 2.0 忽略目录配置方法
前端
濮水大叔2 小时前
Node生态中最优雅的数据库事务处理机制
typescript·nodejs·nestjs
Mintopia2 小时前
Cesium-kit 又发新玩意儿了:CameraControl 相机控制组件全解析
前端·three.js·cesium
ssshooter2 小时前
shader更换后,数据需要重新加载吗?
前端