如何以及何时为 graphql 生成 ID?

Posted

技术标签:

【中文标题】如何以及何时为 graphql 生成 ID?【英文标题】:How and when to generate an ID for graphql? 【发布时间】:2018-04-15 23:51:20 【问题描述】:

我正在将 graphql 与 SQLite 数据库连接。

在 sql 中,id 是整数,但在 graphql 中,id 是字符串。

搜索后,基于这个问题-When to use GraphQLID instead of GraphQLInt?

提出三个建议:

开始使用 UUID 进行 PK。但是,这会影响性能。 忽略隐含的要求(源自 relayjs 生态系统)让 ID 在整个应用程序中唯一,并尽可能将 ID 转换为数字以供内部使用。 应用程序数据层上的哈希编码 ID,例如UUID base64 派生自表名和 PK 值的串联。

推荐第三个。但我不确定在哪里以及如何实现它。另外,为什么graphql ID是一个字符串?答案会影响这个 ID 部分的实现方式。

【问题讨论】:

【参考方案1】:

为什么 GraphQL ID 的序列化和字符串一样?

作为 API 的数据查询语言,希望 GraphQL 在互操作性方面具有特定性,但在其他方面通用以适应不同的用例。如果您查看 answer you linked to 中 GraphQL 规范的引用部分,您可以看到它具体说明了 如何 数据通信(“ID 类型的序列化方式与字符串相同”) ,虽然没有具体说明 ID 类型的内容是什么(仅说它“代表一个唯一标识符”,“通常是数字”,但并非总是如此,没有详细说明)。将 ID 类型序列化为字符串是提供其他未指定标识符数据通信的最直接方式。

因此,虽然您确实需要将 ID 序列化为字符串,但这些 ID 采用何种形式进行预序列化取决于您,因为它最适合您的应用程序。

如何实现序列化

如果您要与 Relay.js 之类的东西交谈,其中 ID 需要是全局唯一的,那么我建议使用第三种方法,将表名和主键连接起来,然后对结果进行 Base64 编码。 (这就是 GraphQL.js 和 Graphene 的做法。)在不了解您的应用程序的情况下,我不能多说 where 您应该进行序列化,但这里有几个示例 如何你可以编码 ID:

# Node.js
var table_name = 'MyTable';
var primary_key = 1234;
var serialized_id = Buffer.from(table_name + ':' + primary_key).toString('base64');

# Python 3
import base64
table_name = 'MyTable'
primary_key = 1234
serialized_id = base64.b64encode((table_name + ':' + str(primary_key)).encode()).decode()

以及如何解码它们:

# Node.js
var serialized_id = 'TXlUYWJsZToxMjM0';
var [table_name, primary_key] = Buffer.from(serialized_id, 'base64').toString('ascii').split(':');

# Python 3
serialized_id = 'TXlUYWJsZToxMjM0'
(table_name, primary_key) = base64.b64decode(serialized_id.encode()).decode().split(':')

希望有帮助!

【讨论】:

以上是关于如何以及何时为 graphql 生成 ID?的主要内容,如果未能解决你的问题,请参考以下文章

在 GraphQL 服务器设置中何时使用 Redis 以及何时使用 DataLoader

如何在 sangria-graphql 中执行突变?

在graphql中为用户类型中的字段编写字段级解析器

如何在两个字段 prisma-graphql 中使用相同的生成 ID

何时使用 `parent` 以及何时使用 `root` 作为 GraphQL-resolver 函数中的第一个参数

graphql-cli 输出不产生@unique