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/ 目录收录了大量真实用例(环检测、深度范围、菱形结构等),可以拿来对照学习。
新手如何快速体验
- 用容器启动一个实例:
docker run --rm -p 8000:8000 surrealdb/surrealdb:latest start- 用任意 HTTP 客户端或 CLI 连接 8000 端口,执行
CREATE建两条记录、RELATE建一条边; - 再执行沿边
SELECT,观察返回的边记录里in、out两个字段分别指向两端节点。
跑通这三步后,建议接着做两件事:给边加属性(比如SET since = time::now()),以及用WHERE在遍历中过滤,这两步基本覆盖了日常用法。
常见应用怎么落地
社交关系分析。找共同好友可以写成从甲沿好友边走一步、再从对方反向走一步的链式查询,一段语句拿到结果,不用维护两张中间表。
相似内容推荐。"买过这台电脑的人还买了什么",就是反向走到购买者、再正向走到他们买的其他商品,方向相反的两段遍历即可表达。
知识图谱。概念之间用is_a、part_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),仅供参考