GraphQL vs SOQL
GraphQL vs SOQL
前言
8月份公司的项目被别的供应商拿走了,我第二份合同刚去年续上的,要到28年5月到期,公司又找不到项目,给了我大礼包协商解除了。
塞翁失马焉知非福,开始回到市场上面试了。今天面了一家学到了挺多的,这是其中一个,提到了一个我从来没听过的东西:GraphQL。
调查研究了下,总结备忘一下。
题外话:奉劝大家在职的还是得每年不管跳不跳槽都得去面试,看看自己哪里不会了,自己还值多少,市场均价多少。职场你以为你都掌握,其实是温水煮青蛙,等想跳出来已经晚了。
GraphQL 和 SOQL 都是查询语言,但设计目标和使用场景不同。SOQL 是 Salesforce 平台内部的数据库查询语言,GraphQL 是面向 API 的通用查询协议,两者在语法和职责上差异很大。
基本定位
| 维度 | SOQL | GraphQL |
|---|---|---|
| 类型 | 数据库查询语言,类似 SQL | API 查询语言,与具体数据库无关 |
| 运行位置 | Salesforce 平台内部(Apex、REST/SOAP API 等) | 客户端向服务端发起请求,服务端解析并执行 |
| 数据来源 | Salesforce 对象(标准和自定义) | 由服务端定义的 schema,可以对接数据库、微服务或其他 API |
| 主要用途 | 在 Apex 或集成中读取 Salesforce 数据 | 为前端或客户端提供灵活的数据获取接口 |
语法对比
同样查询10条Account连带子记录Opportunities,过滤条件为Industry = 'Technology'。
SOQL 示例:
SELECT Id, Name, (SELECT Id, Amount FROM Opportunities)
FROM Account
WHERE Industry = 'Technology'
LIMIT 10
GraphQL 示例:
query {
accounts(industry: "Technology", first: 10) {
id
name
opportunities {
id
amount
}
}
}
两者都能表达关联查询,但 SOQL 使用关系名和子查询,GraphQL 则通过嵌套字段表达关系,字段必须在 schema 中预先定义。
关键区别
-
执行环境
SOQL 直接由 Salesforce 数据库引擎执行,通常嵌入在 Apex 代码中。
GraphQL 是通过 HTTP 发送的请求,由服务端的 GraphQL 引擎解析并调用底层数据源。 -
Schema 的定义方式
SOQL 的结构由 Salesforce 的元数据(对象和字段)决定,开发者不需要单独定义 schema。GraphQL 需要服务端显式定义类型和字段,客户端只能请求 schema 中存在的内容。 -
数据获取的灵活性
SOQL 也可以指定字段,但它是在 Apex 代码中写死的,不是由外部请求动态决定的。
GraphQL 的核心优势是客户端决定返回哪些字段,同一个接口可以服务于不同页面,避免过度获取或获取不足。 -
变更能力
SOQL 只能查询。Salesforce 中写入数据需要使用 DML、REST API 或 Apex,而不是 SOQL。
GraphQL 通常同时支持查询(Query)和变更(Mutation),以及实时订阅(Subscription)。 -
关系查询的深度限制
SOQL 对子查询和父子关系的深度有限制,例如 Apex 中单次查询的关系层级和数量都有上限。GraphQL 理论上可以无限嵌套,但实际实现中通常会设置查询深度和复杂度限制,防止恶意或低效的请求。 -
安全模型
SOQL 遵循 Salesforce 的共享规则、FLS 和对象权限,取决于使用的上下文(如 with sharing)。GraphQL 的权限由服务端实现决定,需要在解析器或中间层自行控制,否则很容易绕过平台的权限模型。
与 Salesforce 相关的使用情况
Salesforce 的 GraphQL 支持:Salesforce 提供了基于 GraphQL 的 API(如 UI API 的 GraphQL 端点),用于 Lightning 体验和外部应用读取记录数据。它的权限仍然由 Salesforce 平台控制,并不是绕过安全模型的通道。
Apex 中不能直接执行 GraphQL 查询:如果外部系统使用 GraphQL,需要通过 Callout 调用,然后在 Apex 中解析 JSON 响应。
与 SOQL 的互补:需要在 Salesforce 内部高效查询数据时用 SOQL;需要为外部客户端提供灵活接口时,可以考虑 GraphQL 或 REST。
简要总结
SOQL 是 Salesforce 的数据库查询语言,面向 Salesforce 对象,在平台内部执行。
GraphQL 是面向 API 的查询协议,由客户端灵活指定数据结构,依赖服务端定义的 schema。
两者解决的问题不同:SOQL 解决的是"如何在平台内高效读取数据",GraphQL 解决的是"如何让客户端灵活地获取数据"。
浙公网安备 33010602011771号