多模态数据库SurrealDB:简介、实战
多模态数据库系列:
概述
对于个人开发者或初创小团队而言:
- ACID事务支持基本上是刚需,MySQL或PG必备;为提示应用访问性能,又得部署一套Redis等键值对缓存系统;
- 如果有时序数据分析需求,则需要安装InfluxDB或TDengine或其他选项;
- 有知识图谱或数据血缘这类需求时,则需要部署类似于Neo4j的图数据库;
- 很多内容网站或企业级应用必不可少会存在文件管理,于是运维得安排MinIO等私有化部署方案;
- 不得不承认的是,AI/LLM时代,应用里没有个聊天助手功能,就已经落伍,于是又得不是Milvus等向量搜索引擎;
- 还有文档存储数据库MongoDB…
于是,把上述所有(或部分)DB统一放到一个数据库引擎,就是一个非常常见的刚需。
简介
官网,用Rust写的开源(GitHub,32.8K Star,1.3K Fork)多模型数据库,把文档、图、关系、时序、地理空间和向量全塞进同一个引擎里;对外暴露SurrealQL查询语言,语法接近SQL但能同时表达图遍历、向量相似搜索和实时订阅,官网文档。
功能特性:
- 减少开发时间:将数据库、查询层、API和认证层整合到一个平台,减少对传统后端组件的依赖
- 实时协作API后端服务:既是数据库,也是API后端服务,支持实时协作
- 支持多种查询语言:支持从客户端设备进行SQL查询、GraphQL(即将推出)、ACID事务、WebSocket连接、结构化和非结构化数据、图查询、全文索引和地理空间查询
- 支持WebSocket,客户端可订阅数据变化,用于实时协同场景
- 细粒度访问控制:提供行级权限控制,可直接在数据库层定义哪类用户能读写哪些记录,精确管理数据访问
- 多模型支持:允许开发者使用多种技术存储和建模数据,无需预先选择特定方法
- 高级文档间关系:通过记录链接和图边连接实现高效的关联查询,避免复杂JOIN操作
- 简单模式定义:统一数据库和API模式定义,简化前端和后端开发
- 直接从客户端连接:允许Web浏览器和客户端设备直接连接并查询,无需额外API服务层,内置权限控制
- schema支持无模式、严格模式以及混用,通过
DEFINE TABLE定义; - 支持
RELATE关键词建立有向图边,图路径查询语法:->follows->; - 支持
MTREE、HNSW算法创建向量索引,K近邻搜索:<|>; - 实时查询和数据变更:实时同步数据修改到客户端,支持高级过滤和高效的数据格式(如DIFFing和PATCHing)
- 轻松扩展:可作为单节点内存数据库运行,也可扩展到分布式集群,提供高可用性和可伸缩性
- 通过JS函数扩展:支持嵌入式JS函数,将计算逻辑移至数据层
- 可嵌入或云端部署:完全用Rust构建,可作为嵌入式库或分布式数据库服务器使用
- MCP:作为服务器,可对接AI Agent工作流;
- SDK:覆盖Rust、JavaScript/TypeScript、Python、Go、.NET、PHP、Java等主流语言
安装
官方提供单一Rust二进制文件,可内嵌进应用进程(通过Rust Crate或WebAssembly),也可在边缘节点以单机模式跑,以分布式集群运行在云上。
支持多种部署安装方式,对于Windows系统来说,最简单的可能是从GitHub Release页面下载surreal-v3.2.0.windows-amd64.exe,和执行iwr https://windows.surrealdb.com -useb | iex命令的区别在于,前者是稳定版本,版本号略滞后;命令行方式安装永远是最新版,并附带日期+CommitId信息:

通过命令行方式安装:
# Mac、Linux
curl -sSf https://install.surrealdb.com | sh
brew install surrealdb/tap/surreal
# Windows
iwr https://windows.surrealdb.com -useb | iex
# Docker:默认基于内存
docker run --rm --pull always --name surrealdb -p 8000:8000 surrealdb/surrealdb:latest start
# 带认证
docker run --rm --pull always --name surrealdb -p 8000:8000 surrealdb/surrealdb:latest start --log info --user root --pass root memory
# 持久化到RocksDB存储引擎
docker run --rm --pull always -p 8000:8000 --user $(id -u) -v $(pwd)/mydata:/mydata surrealdb/surrealdb:latest start rocksdb:/mydata/mydatabase.db
安装截图

命令行使用:
surreal start
surreal start --user dev --pass root memory
解读:
- 指定存储引擎,支持:
memory(内存,默认)、rocksdb(单节点磁盘)或tikv(多节点集群) - 默认情况下,用户名和密码都设置为
root。
执行surreal start,效果图

浏览器打开http://localhost:8000,自动跳转到https://surrealdb.com/studio

先点击【Download for Windows】,得到surrealdb-studio-1.0.5.exe。
SurrealDB Studio
双击文件,安装过程略,打开应用,Google或GitHub登录,需勾选用户信息,方能使用,有点烦啊,不填写信息不让用

界面大致摸索一下,找到【连接】管理,新增连接:

先去看看【实例】管理,实际上就是在使用SurrealDB Cloud,下滑查看。
回到连接,支持2种类型:Remote(包括4种协议类型,HTTP、HTTPS、WS、WSS),Local(包括Memory):

此处选择Memory,点击下一步即可。
连接沙箱和下面的实例菜单,几乎差不多;可这样理解,连接归属于实例,一个实例可创建多个连接。

看到熟悉的SQL编辑框

点击【Combined】查看数据展示样式

支持5种视图:
- Combined(组合):在单个列表中查看所有结果
- Individual(独立):逐一检查每个结果
- Table(表格):以表格形式渲染查询结果
- Graph(图表):以图形化方式可视化查询结果
- Live(实时):订阅实时查询结果
点击【Table】可看到刚从创建的表,Schema也是

新增API

添加Handler,选择HTTP方法(GET、PUT、POST、PATCH、DELETE、TRACE),方法支持多选。但API定义好后,如何使用呢?
分析器

SurrealDB Cloud

点击【部署】,提供超多种定价计划:

页面底部,可找到更多定价方案。此处当然选择【Free】档位,进入详情页,部分参数不一致

支持选择5个地区

支持2个大版本的最新版本号:

查看实例,由于Cloud和Studio版本界面差别不大,此处截图Studio。开看到实例概览、Schema、认证、查询、表、函数、参数、API、分析器、指标和日志、设置多个入口菜单。

SurrealDB Web
打开上面提到的Launch in the browser,即打开在线SaaS,界面、布局、功能啥的和SurrealDB Studio一模一样。

推荐使用本地版Studio,数据在本地。
JS SDK
在数据库中编写自定义JS函数,将计算逻辑移至数据层。
CREATE film SET
ratings = [
{ rating: 6, user: user:bt8e39uh1ouhfm8ko8s0 },
{ rating: 8, user: user:bsilfhu88j04rgs0ga70 },
],
featured = function() {
return this.ratings.filter(r => {
return r.rating >= 7;
}).map(r => {
return { ...r, rating: r.rating * 10 };
});
};
SurrealQL
-- 建表
CREATE category SET name = 'Technology', created_at = time::now();
-- 创建指定ID的记录
CREATE person:john SET name = 'John Doe', age = 30, admin = true, signup_at = time::now();
CREATE article SET title = 'My First Article', category = (SELECT id FROM category WHERE name = 'Technology')[0];
-- 查询
SELECT * FROM article;
SELECT * FROM person:john;
SELECT title, author.name.full FROM article WHERE author.age < 30 FETCH author;
-- 修改
UPDATE person:john SET age = 31;
UPDATE user WHERE status = 'active' MERGE { last_login = time::now() };
UPSERT user:alice SET email = 'alice@example.com' ON DUPLICATE KEY UPDATE last_updated = time::now();
-- 删除
DELETE person:john RETURN BEFORE;
SurrealDB支持强类型数据,包括布尔值、字符串、数字(decimal、int、float)、日期时间、持续时间、数组、嵌套对象和GeoJSON地理空间数据。
UPDATE person SET
waist = <int> "34",
height = <float> 201,
score = <decimal> 0.3 + 0.3 + 0.3 + 0.1;
动态计算字段:将字段定义为future类型,其值仅在查询时计算。
CREATE product SET
name = "SurrealDB",
launch_at = <datetime> "2021-11-01",
countdown = <future> { launch_at - time::now() }
;
可定义表的模式(schemafull或schemaless),并为字段添加类型、断言(ASSERT)和默认值。
-- 创建一个带模式的表
DEFINE TABLE user SCHEMAFULL;
-- 指定用户表的字段
DEFINE FIELD name ON TABLE user TYPE object;
DEFINE FIELD name.first ON TABLE user TYPE string;
DEFINE FIELD name.last ON TABLE user TYPE string;
DEFINE FIELD email ON TABLE user TYPE string ASSERT string::is::email($value);
-- 在 email 字段上添加唯一索引,防止重复值
DEFINE INDEX email ON TABLE user COLUMNS email UNIQUE;
-- 当用户邮箱地址改变时创建一个新事件
DEFINE EVENT email ON TABLE user WHEN $before.email != $after.email THEN (
CREATE event SET user = $value, time = time::now(), value = $after.email, action = 'email_changed'
);
图关系:使用RELATE语句在记录之间创建图边连接。
RELATE user:tobie->write->article:surreal SET time.written = time::now();
为表定义细粒度的访问权限,控制用户对数据的选择、创建、更新和删除操作。
DEFINE TABLE post SCHEMALESS
PERMISSIONS
FOR select
-- 已发布的帖子可以被选择
WHERE published = true
-- 用户可以查看自己的所有帖子
OR user = $auth.id
FOR create, update
-- 用户可以创建或更新自己的帖子
WHERE user = $auth.id
FOR delete
-- 用户可以删除自己的帖子
WHERE user = $auth.id
-- 或者管理员可以删除任何帖子
OR $auth.admin = true;
向量:
-- 定义表
{
DEFINE TABLE documents;
DEFINE FIELD text ON documents TYPE string;
DEFINE FIELD embedding ON documents TYPE array<float, 4>;
};
-- 向量索引
DEFINE INDEX OVERWRITE documents_vec_index
ON TABLE documents
FIELDS embedding
HNSW DIMENSION 4 DIST COSINE TYPE F32;
{
CREATE documents CONTENT { text: "foo", embedding: [1f, 2f, 3f, 4f] };
CREATE documents CONTENT { text: "bar", embedding: [2f, 2f, 2f, 2f] };
CREATE documents CONTENT { text: "zar", embedding: [5f, 4f, 3f, 2f] };
};
-- 查询
LET $vector = [1f, 1f, 1f, 1f];
SELECT
*,
// knn() uses the distance function from the index
(1 - vector::distance::knn()) AS score
// while the following gets computed independently from the index
// vector::similarity::cosine(embedding, $vector) AS similarity
OMIT embedding // 忽略embedding字段
FROM documents
WHERE embedding <|2,40|> $vector;
-- 等价函数
DEFINE FUNCTION OVERWRITE fn::search($vector: array<float>) {
RETURN SELECT
*,
(1 - vector::distance::knn()) AS score
OMIT embedding
FROM documents
WHERE embedding <|2,40|> $vector;
};
RETURN fn::search([1f, 2f, 3f, 4f]);
CLI
官方提供
Surrealist
官方提供Surrealist可视化管理客户端,在图形界面里写SurrealQL、浏览数据、检查执行计划。
官网,TypeScript编写、开源(GitHub,1.3K Star,116 Fork)专为SurrealDB设计的数据可视化管理利器,以其直观的操作界面和全面的功能,简化数据库管理的复杂度。
内置变量定义、查询历史记录管理等;强调安全性与灵活性,支持多种认证方式和数据库配置,确保数据安全的同时,赋予用户高度自定义的权限管理能力。
特点
- 全功能的Web与Desktop体验:通过web app或桌面客户端,用户可随时随地访问和管理数据库
- 交互式的查询与结果展示:强大的查询视图,支持变量、保存查询和历史追踪
- 图形化数据库设计:直观的设计师视图,简化复杂模式的设计过程
- 全面的安全控制:细化的认证与权限管理系统,保证数据的安全性
- 便捷的本地服务器启动:桌面版允许一键启动SurrealDB本地实例,方便调试与开发
- 学习与实验友好:内置Sandbox模式,提供零成本的学习环境
打开GitHub Release页面,以Windows系统为例,下载Surrealist_3.9.10_x64-setup.exe,双击安装失败的话,打开PowerShell,手动安装:

实际上就是得到2个.exe文件,一个二进制文件,一个用于卸载。
自带示例数据集这点深得我心

点击下载数据集。遇到的问题,下载失败:

点击注册,使用Google登录,跳转回GUI客户端又失败。
点击概览-连接

点击内置的沙箱(Sandbox),功能设置真贴心:

AI功能主要有2个入口,点击第一个按钮:

有4种方式:

新增连接,和SurrealDB Studio稍微不同

客户端工具点击Memory类型时,认证方式默认切换到匿名(Anonymous)。
由于个人知识误区,切换到【Root】,如上图,并输入默认用户名密码root,遇到问题

SQL当然也执行异常

实际上切换到【匿名】,即可连接到本地内存数据库,执行SQL。

更多推荐
所有评论(0)