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 中预先定义。

关键区别

  1. 执行环境
    SOQL 直接由 Salesforce 数据库引擎执行,通常嵌入在 Apex 代码中。
    GraphQL 是通过 HTTP 发送的请求,由服务端的 GraphQL 引擎解析并调用底层数据源。

  2. Schema 的定义方式
    SOQL 的结构由 Salesforce 的元数据(对象和字段)决定,开发者不需要单独定义 schema。GraphQL 需要服务端显式定义类型和字段,客户端只能请求 schema 中存在的内容。

  3. 数据获取的灵活性
    SOQL 也可以指定字段,但它是在 Apex 代码中写死的,不是由外部请求动态决定的。
    GraphQL 的核心优势是客户端决定返回哪些字段,同一个接口可以服务于不同页面,避免过度获取或获取不足。

  4. 变更能力
    SOQL 只能查询。Salesforce 中写入数据需要使用 DML、REST API 或 Apex,而不是 SOQL。
    GraphQL 通常同时支持查询(Query)和变更(Mutation),以及实时订阅(Subscription)。

  5. 关系查询的深度限制
    SOQL 对子查询和父子关系的深度有限制,例如 Apex 中单次查询的关系层级和数量都有上限。GraphQL 理论上可以无限嵌套,但实际实现中通常会设置查询深度和复杂度限制,防止恶意或低效的请求。

  6. 安全模型
    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 解决的是"如何让客户端灵活地获取数据"。

posted @ 2026-11-05 19:54  Victor-Wei  阅读(5)  评论(0)    收藏  举报