多模态数据库系列:

概述

对于个人开发者或初创小团队而言:

  • 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->
  • 支持MTREEHNSW算法创建向量索引,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() }
;

可定义表的模式(schemafullschemaless),并为字段添加类型、断言(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。
在这里插入图片描述

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐