news 2026/9/2 9:49:23

SurrealDB 图形数据库入门:用关系查询替代复杂 JOIN

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SurrealDB 图形数据库入门:用关系查询替代复杂 JOIN

SurrealDB 图形数据库入门:用关系查询替代复杂 JOIN

【免费下载链接】surrealdbA scalable, distributed, collaborative, document-graph database, for the realtime web项目地址: https://gitcode.com/GitHub_Trending/su/surrealdb

SurrealDB 图形数据库是一个用 Rust 编写的多模型数据库,支持文档、关系与图形三种数据模型。它的 SurrealDB 关系查询让你可以直接在记录之间建立"边",并用一条语句沿边遍历多层数据,适合社交关系、推荐、知识图谱等场景,也适合想减少复杂 JOIN 的开发者。

在关系型数据库里,一旦数据涉及"朋友的朋友的朋友"这类多层关联,写起来会明显变累:

  • 每加一层关系,就要多一次 JOIN 或子查询,SQL 越写越长;
  • 多对多关联(用户-文章-评论)容易引发 N+1 问题,即先查主表、再对每条记录单独查关联表;
  • 循环引用(甲认识乙、乙又认识甲)需要额外处理,否则会无限递归。

而数据本身其实就是图:节点是实体,边是"谁和谁有什么关系"。SurrealDB 把这种直觉直接写进了查询语言,让图形查询和建模保持同一种表达方式。

哪些关系数据适合用它

判断标准很简单:你的实体之间是否存在"方向 + 类型"的连接。

  • 社交网络:关注、好友、点赞,都是带方向的关系边;
  • 内容平台:作者-文章-评论-回复,层级较深且互相交叉;
  • 知识图谱:概念之间的"是一种""属于"等语义关系;
  • 风控与审计:账户-转账-账户形成的链式追踪。

如果你的业务主要是单表 CRUD,图形模型意义不大;一旦"查关联"开始占查询逻辑的大头,图形遍历就会比 JOIN 更直观,也更便于维护。

图形查询为什么更直观

SurrealDB 的核心概念只有三个:

  • 记录:类似文档,带唯一 ID,如user:alice
  • 边:用RELATE语句在两条记录之间创建,边本身也是一条记录,可以存属性;
  • 遍历:SELECT时直接沿边走向下一层,->表示方向。

写一条关系:

RELATE user:alice->follows->user:bob;

沿关系查询时,方向读起来就是一句话:"从 alice 出发,沿 follows 边到用户":

SELECT * FROM user:alice->follows->user;

多层遍历同理,链式书写即可,无需再 JOIN 自己:

SELECT * FROM user:alice->knows*1..2;

上面这条会取回 1 到 2 层之内的熟人网络。仓库中的 language-tests/tests/language/graph/ 目录收录了大量真实用例(环检测、深度范围、菱形结构等),可以拿来对照学习。

新手如何快速体验

  1. 用容器启动一个实例:
docker run --rm -p 8000:8000 surrealdb/surrealdb:latest start
  1. 用任意 HTTP 客户端或 CLI 连接 8000 端口,执行CREATE建两条记录、RELATE建一条边;
  2. 再执行沿边SELECT,观察返回的边记录里inout两个字段分别指向两端节点。

跑通这三步后,建议接着做两件事:给边加属性(比如SET since = time::now()),以及用WHERE在遍历中过滤,这两步基本覆盖了日常用法。

常见应用怎么落地

社交关系分析。找共同好友可以写成从甲沿好友边走一步、再从对方反向走一步的链式查询,一段语句拿到结果,不用维护两张中间表。

相似内容推荐。"买过这台电脑的人还买了什么",就是反向走到购买者、再正向走到他们买的其他商品,方向相反的两段遍历即可表达。

知识图谱。概念之间用is_apart_of等自定义边类型连接,边的类型天然就是语义标签,检索时可以按边名过滤,结构比"关联表 + 类型字段"更清晰。

行为链路追踪。登录-支付-退款这类事件链,每步是一条边,按时间字段排序遍历就能还原完整路径。

与传统方案相比要注意什么

和"纯关系型 + JOIN"以及"专用图数据库"相比,选型时主要看这几点:

  • 查询表达:SurrealDB 的遍历写在一条 SELECT 里,减少多次往返;但边关系一旦建立,跨库迁移要考虑边的存储方式;
  • 模型混合:同一库中图形、文档、全文检索可以并存,适合不想拆多套存储的团队;代价是单表超大规模分析场景仍需配套工具;
  • 性能特征:多层遍历的耗时随层数增长较快,适合"深度有限、宽度可控"的查询,不适合无界全图扫描;
  • 生态位置:如果系统已经在用 SurrealDB 存文档数据,加图形能力成本很低;若只是简单两级关联,普通索引查询也够用。

使用建议与性能提醒

  • 给高频遍历的边端点建索引,避免全表扫描定位起点;
  • 控制遍历深度,用*1..3这类范围而不是开放深度;
  • 大批量建边放在同一事务里提交,减少反复写入;
  • 实时场景可用LIVE SELECT订阅变更,省去客户端轮询;
  • 先在测试库验证遍历路径,再上生产,环状数据要设深度上限。

下一步

  • 本地构建与运行环境配置,参考 doc/BUILDING.md;
  • 图形遍历的真实用例集在 language-tests/tests/language/graph/,可逐文件阅读;
  • 需要拉取源码时,仓库地址为 https://gitcode.com/GitHub_Trending/su/surrealdb。

建议的学习路径:先跑通 RELATE 与沿边 SELECT,再读几个 graph 用例文件,最后把自己的一个真实关系表(比如用户-关注)迁移成"节点 + 边"模型,对比一下查询写法的差异,图形思维很快就能建立起来。

【免费下载链接】surrealdbA scalable, distributed, collaborative, document-graph database, for the realtime web项目地址: https://gitcode.com/GitHub_Trending/su/surrealdb

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 9:48:24

ExplorerPatcher 快速指南:3 步把 Win11 界面改回 Win10 风格

ExplorerPatcher 快速指南:3 步把 Win11 界面改回 Win10 风格 【免费下载链接】ExplorerPatcher This project aims to enhance the working environment on Windows 项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher 刚换上 Windows 11&a…

作者头像 李华
网站建设 2026/9/2 9:46:04

STM32与QT开发无人超市系统:从硬件驱动到上位机设计的全流程解析

简介:本资源是一套完整的嵌入式智能零售系统实战项目,面向STM32与Qt跨平台开发学习者、毕业设计学生及嵌入式初学者,解决无人超市核心功能(RFID会员管理、商品电子标签识别、闸机联动控制)的软硬件协同实现问题。压缩包…

作者头像 李华
网站建设 2026/9/2 9:43:43

SensorSimulator2.0实战:用数据表达式模拟物联网传感器上报

简介:一份面向 Android 传感器开发与测试的实用工具包,内置 SensorSimulator 2.0 RC1 传感器模拟器,覆盖加速度计、指南针、方位、温度、光照、距离、压力、重力、线加速度、旋转矢量、陀螺仪等常见传感器,适合在模拟器或缺少真机…

作者头像 李华
网站建设 2026/9/2 9:43:13

基于SpringBoot+Vue的考勤系统全栈开发:从业务模型到高并发优化

简介:这是一套面向计算机专业本科生的高分毕业设计项目资源,聚焦企业级日常考勤管理场景,适用于毕设开题、课程设计与Java全栈开发实践。资源完整包含可直接运行的前后端源码、MySQL 5.7数据库脚本、配套毕业论文(DOC/DOCX格式&am…

作者头像 李华