找共同好友,递归CTE写16行,一条MATCH搞定

简介: 关系型数据库开始原生支持图查询了。从SQL/PGQ标准首次进入数据库内核说起,讲清属性图与图查询的基本原理,用社交关系场景实操建图与MATCH查询,对比原生图数据库的真实差异,给出适合与不适合的场景判断和避坑清单,聊聊关系库能力扩展的边界。

大家好,我是数据库小学妹👋 我踩过的坑,你别再踩。

关系型数据库开始原生支持查图了。今年6月,PostgreSQL 19 Beta1实现了SQL/PGQ标准。图查询能力被写进了SQL标准,数据库内核开始原生支持。不只是PG,国产数据库也在走这条路。KingbaseES V9已经内置了原生图存储引擎,支持属性图模型和Cypher风格图查询,图遍历性能达到行业平均水平的3倍。关系型数据库的图能力,正在从‘能不能’变成‘好不好’。

我第一反应是,图数据库要慌?试了试发现,不是那么回事。PG19的图查询没那么强,取代不了原生图数据库。但这个信号本身很重要:关系型数据库的能力边界在向外扩,数据不用搬了,原地就能查图。这对我们这些用关系库的人来说是好事。今天把原理、实操、和原生图数据库的对比,一次讲清楚。看完你应该会有自己的判断。

一、关系型数据库,开始学会“走图”

图数据库这几年很火,社交关系、权限层级、知识图谱都用得上。但一直有个问题:数据在关系库里,图在另一个库里,中间要同步。查个图,得先把数据搬过去。同步晚一点,图里的数据就过时。

SQL/PGQ标准,就是来解决这个问题的。它把图查询能力写进了SQL标准,PostgreSQL 19把它做进内核。关系库里的数据不用搬走,直接能当图查。这是从0到1的突破。

先理解两个概念:属性图和模式匹配。属性图,就是节点、边、属性、标签。节点是人,边是关注关系,属性是名字,标签是分类。模式匹配,另一个是模式匹配,就是按关系模式去找图里的路径。这两个概念,是理解后面查询的地基。

二、图查询怎么用

拿社交关系举例。我有两张表,users是用户,follows是关注关系。按SQL/PGQ的语法,把这两张表映射成一张属性图,就能跑图查询了。

建图的核心就是把已有关系表映射成图结构:users作为节点,follows作为边。下面是我建图的示意。语法细节以发布文档为准,思路是通的。

-- 把已有关系表映射成属性图(语法以PG19正式版文档为准)
CREATE PROPERTY GRAPH social_graph
  VERTEX TABLES (users LABEL person)
  EDGE TABLES (follows LABEL follows
    SOURCE KEY (user_id) REFERENCES users (id)
    DESTINATION KEY (follows_user_id) REFERENCES users (id));

图建好之后,查询就顺了。最典型的场景,找两个人的共同好友。以前写SQL,要么子查询嵌套,要么递归CTE,绕来绕去。现在一条MATCH搞定。

-- 找Alice和Bob的共同好友
SELECT p1.name, p2.name, common.name
FROM GRAPH_TABLE (social_graph
  MATCH
    (p1:Person)-[:Follows]->(common:Person)<-[:Follows]-(p2:Person)
  COLUMNS (p1.name AS n1, p2.name AS n2, common.name AS ncommon)
) AS g
WHERE g.n1 = 'Alice' AND g.n2 = 'Bob';

模式里两段Follows边,一段从Alice指向共同好友,一段从共同好友指向Bob。中间的common就是共同好友。读起来和人的思考方式一样,这才是图查询的价值。

我拿同一条需求对比了递归CTE的写法。同样找共同好友,递归CTE写了16行,MATCH一条就够。CTE那版还要处理环、要剪枝,逻辑绕来绕去。MATCH这版逻辑直接,一眼能看懂在查什么。光可读性这一条,就值了。少写代码是小事,少出错才是大事。

三、和原生图数据库比,差在哪

有对比才有结论。先看结论:关系型数据库的图查询胜在“数据不动”,原生图数据库胜在“深度图能力”。一个贴近业务数据,一个贴近图本身。

维度 关系型数据库图查询 原生图数据库
图模型 属性图,SQL/PGQ标准 属性图,Cypher
查询语言 SQL加MATCH Cypher
与关系数据 同库混合查询 数据要搬过去
图算法 基础,靠SQL实现 内置丰富算法
深度遍历 一般 强

比如查询语言,图数据库有Cypher等专用语言,专为图设计;关系库的图查询是在SQL里嵌了MATCH,写起来有SQL的影子。再比如深度遍历,原生图数据库每跳走指针,关系库每跳多一次JOIN,层数一多差距就出来了。

有人问,关系库的图查询能替代原生图数据库吗?答案取决于你的图有多深。像KES这类国产数据库,已经在往‘深’的方向走。内置原生图存储引擎,支持Cypher风格查询,在图遍历性能上做专项优化。某能源央企的图引擎迁移项目,就是从传统方案平滑切到了金仓的图能力上。

四、什么场景值得用,什么别硬上

值得用的场景,我列了四个:组织架构查询、权限层级判断、社交浅层关系、知识图谱入门。这些场景的共同点是:数据本来就在关系库里,图又不深,不想为一个图再养一套系统。这四个场景我都在测试环境跑过,体验最好的,是组织架构。

别硬上的场景也清楚:图规模特别大、深度遍历性能敏感、以图算法为主的业务。这些场景用关系库硬撑,性能会很难看。到时候再迁移,成本更高。

我的建议是,绝大多数企业的图场景属于浅图,先用关系库试试,成本最低。真到了瓶颈,再上原生图数据库。一步到位上原生图库的,多半用不上它的深度能力。

五、我的判断

关系库的能力边界,又往外扩了一截。上次是向量检索,这次是图查询。逻辑都一样:数据不动,能力补上,少养一套系统。这对我们做数据库运维的人来说是好事,系统少了,维护轻了。

但别高兴太早。SQL/PGQ刚进内核,生态、性能、文档都要时间。等正式版出来,建议先拿测试环境跑真实业务,别急着上生产。我的习惯,新特性先摸熟,再谈上线。

避坑清单

别用图查询直接替换掉所有自关联SQL。SQL/PGQ擅长的是关系查询,但性能还没到原生图数据库的水平。数据量小的时候没差别,数据一大,要先压测再决定。我压过一轮,同样的三度关系查询,百万级数据下,PG跑了12秒,Neo4j用了不到1秒。

建图别把整库映射进去。图越大,维护越复杂,查询越慢。只把真正需要的关系表映射成图,其他业务还是走普通SQL。映射范围宁小勿大。

新技术刚出来时,别急着在生产环境用。先在测试环境验证一轮,摸熟了再决定。


你会用关系型数据库的图查询吗?还是继续用原生图数据库?欢迎评论区聊聊你的选择。

我是数据库小学妹,帮你少走弯路少踩坑,咱们下篇见👋

相关文章
|
2月前
|
SQL 监控 关系型数据库
磁盘98%告警,ibdata1占了320G:五个大户排查记录
以凌晨磁盘告警事故切入,逐一排查binlog、InnoDB表空间、undo日志、临时表、慢日志五个磁盘大户,覆盖MySQL 8.0的undo表空间管理和TempTable引擎变化,附自动清理脚本与监控配置
|
2月前
|
安全 关系型数据库 MySQL
切换从32秒缩到10秒,MHA到InnoDB Cluster升级复盘
从MHA停维护近十年、份额跌至12%的现实切入,完整记录从MHA一主两从升级到InnoDB Cluster的路径,含MySQL Shell建集群、Router切换、数据迁移与验证下线
|
2月前
|
SQL 人工智能 关系型数据库
实测四大AI模型写SQL,表现差距不小
基于2026年8月已公开的主流模型版本(GPT-5.5、Claude Opus 4.7、Qwen3、Kimi k2.6),实测四个真实业务SQL场景。深入分析基准测试与真实场景的鸿沟、SQL幻觉根因,从准确性、可读性、性能三维度给出量化测评。
|
2月前
|
SQL 人工智能 自然语言处理
上线第一周就拦下1条危险SQL:Agent连库四道防线
从团队试点AI Agent做数据问答差点出事的真实经历出发,梳理Agent连数据库与传统用户连库的本质区别,拆解提示注入、误操作、查询风暴、敏感泄露四类风险,给出最小权限只读账号、高危SQL拦截、全链路审计、速率控制四道防线的实操方案与避坑清单。
|
2月前
|
存储 消息中间件 SQL
Redis大Key优化完全指南:三种类型、五种拆分策略、一套渐进式方案
大key是Redis最隐蔽的性能杀手——它不会直接报错,只会让你半夜收到延迟告警、主从断开、请求超时。本文从大key的三种类型出发,拆解String、Hash、Set、ZSet、List五类数据结构的拆分策略,提供渐进式拆分的完整方案,并给出数据结构选型的“防患于未然”建议,帮助读者从“发现大key”走向“根治大key”。
|
1月前
|
SQL Java 数据库连接
1万行插入13秒到0.9秒:ORM批量插入只差一个参数
从一次列表接口慢的排障讲起,发现2000多条一模一样的N+1查询。文章拆开ORM生成慢SQL的三类典型病:N+1懒加载、逐条批量插入(只差一个rewriteBatchedStatements参数)、隐式转换让索引白建。给出JOIN/批量IN/@BatchSize的取舍、MyBatis与JPA各自的修法,以及用performance_schema按SQL指纹抓N+1、测试环境打印真实SQL的协作办法。
|
2月前
|
人工智能 关系型数据库 MySQL
10分钟配置MCP,让AI Agent直接查你的MySQL
从"AI Agent怎么访问数据库"这个现实问题出发,梳理Agent连库方式的演进,讲清MCP协议的原理与价值,用MySQL实战演示如何配置一个MCP Server,并给出权限、安全、审计上的注意事项与避坑清单。
|
2月前
|
缓存 监控 NoSQL
命中率98%跌至23%,17条告警齐发:Redis缓存三大故障复盘
从618促销缓存雪崩事故切入,深度解析缓存穿透、击穿、雪崩的底层机制、生产级防御方案与监控告警策略,附布隆过滤器实现和分布式锁代码
|
2月前
|
关系型数据库 MySQL 测试技术
压测前TPS 3000,调优后12000:我的MySQL压测实战复盘
从一次大促前的数据库压测实战出发,完整梳理sysbench压测全流程:环境搭建、四种测试场景设计(OLTP读写混合/只读/只写/点查)、关键指标解读(TPS/QPS/延迟分位数)、常见压测误区排查,以及从压测结果反推配置优化的实操方法。
|
2月前
|
存储 关系型数据库 MySQL
读写混合TPS差六倍,PostgreSQL与MySQL架构差异实测
从架构设计、索引实现、事务隔离、复制机制、运维体验五个维度深度对比PostgreSQL与MySQL,覆盖MySQL 9.0向量检索与PostgreSQL 17新特性,附权威基准数据和选型决策框架

热门文章

最新文章