首页 > 解决方案 > GraphQL 模式可以用作数据库模式定义吗?

问题描述

我正在做一个个人项目(在服务器端非常简单)并计划使用 GraphQL(第一次)。我有点理解 GraphQL 不是 ORM,因此 GraphQL 模式与数据库模式不同。但是对于我的简单项目,服务器端的整体功能只是基本的 CRUD,目前可能只有一张表。对于这种场景,我真的不想在 GraphQL 和一些 ORM 中重复架构定义。这两种模式可以统一吗?我应该如何做到这一点?

PS 我打算使用 NodeJS 进行服务器端开发。

标签: databasegraphql

解决方案


根据个人设计和实现 GraphQL 服务的经验,我想建议您对模式有一点不同的看法。原因如下:

您的 DB 模式定义了您的 DB 有效存储数据、结构关系和查询信息所需的严格参数,具体到您使用的 DB 类型。您的数据库架构在您的应用程序如何合理地管理持久数据方面发挥着重要作用。

另一方面,您的 GraphQL 架构描述了您可以从服务器获取的数据的形状/类型/结构,以及您可以用它做什么——这可能是来自您的数据库、外部 API、其他服务的数据您的服务器通信的对象等。

更重要的是,您的 GraphQL 模式描述了普通人希望如何与您的服务器交互,而无需了解服务器如何/在何处/为何获取其数据的内部细节。

您的 GraphQL 架构不应与您的数据库架构统一,因为它 1)不是数据库,2)不代表您的数据库的内部结构——它代表来自您的服务器的任何数据,与该数据的位置无关起源。

即使您正在构建一个带有单个表且没有“外部”数据的简单 CRUD 应用程序,单独考虑 DB 和 GraphQL 模式仍然很有价值。

首先,想想你理想的 GraphQL API 应该是什么样子。毕竟,它代表了您向最终用户公开的功能和数据。这些数据是什么,这些数据会是什么样子?什么是 GraphQL 类型、查询、突变、订阅等。我需要定义以实现这一点?

现在您已经使用 API Schema 定义了理想情况下希望如何与服务器交互,请设计 DB Schema 来表示您想要创建、读取、更新和删除的数据。

你可能会发现你的 GraphQL 和 DB 模式最终会以相似的方式定义相同的数据,尤其是对于非常简单的应用程序 - 但很有可能,如果你以“graphql 模式优先”的心态进行设计,你可能会很高兴忘记这一点当您的应用程序扩展时,您会引入更多的关系数据,您的架构会变得更加复杂,或者以上所有情况 :)

但是...您可能想看看这个目前仍处于早期开发阶段的出色库https://github.com/danielrearden/sqlmancer,它允许您将 GraphQL 语句转换为 SQL 查询(不是数据库架构!)


推荐阅读