nosql - 如何将 GraphQL 用于企业应用程序
问题描述
在我的问题之前做一个简短的介绍:
我目前正处于开发企业应用程序的计划阶段,其中有许多服务,每个服务都有大量的业务逻辑。
我最近被介绍并要求加入 GraphQL
- 坦率地说,我不明白这一点。它似乎是数据库的包装器。如果我们以声明的方式编写我们想要的数据,GraphQL 会以简洁的 JSON 格式为我们提供数据。对我来说,正确的 NoSQL 查询没有任何区别。
- 由于业务逻辑呈现给客户端浏览器,因此 JavaScript 繁重的应用程序的安全性较低,可以对其进行调整以改变行为。GraphQL 倾向于依赖前端直接与数据通信的此类应用程序。传统的 NoSQL 查询可以在从客户端获取所需信息后从服务器运行。
问题:
如果 GraphQL 直接从数据库中获取数据并呈现出来,如何实现 GraphQL 来处理中间件任务、后端验证等业务逻辑、复杂的业务检查、批处理等?如果不是,那么它只是数据库查询之上的声明性库吗?
解决方案
如果 GraphQL 直接从数据库中获取数据并呈现出来,如何实现 GraphQL 来处理中间件任务、后端验证等业务逻辑、复杂的业务检查、批处理等?
GraphQL 不直接从数据库中获取数据。GraphQL 实现通过与任何其他端点没有什么不同的端点公开,这意味着您可以使用任何您想要的中间件、身份验证堆栈、验证等。它也与数据库无关。同样,您可以使用任何您想要的数据库、ORM 等组合。
如果不是,那么它只是数据库查询之上的声明性库吗?
不完全的。GraphQL 实现有两个主要部分——模式和解析器。架构简单地定义了数据的形状,解析器完成了繁重的工作。解析器是定义如何为模式中定义的每个字段获取和转换数据的逻辑层。更多关于解析器的信息如下。
它与使用 NoSQL 数据库有何不同?
GraphQL 的主要卖点是让消费者准确定义他们需要的数据。对于平面(即非嵌套)数据,这可能没什么大不了的。但是,当您开始处理更多嵌套的数据时,它会变得越来越有利。例如,假设您有一个 GraphQL 查询,如下所示:
query {
user(userId: "some_user_id") {
...userData
projects {
...projectData
assets {
...assetData
}
}
}
}
我们正在获取用户、该用户的项目以及每个项目的资产,我们可以准确地指定每个级别需要哪些字段。一个用户可能有 15 个字段,但也许我们只想要其中的两个或三个。项目和资产也可能如此。由于 GraphQL 解析器很智能,我们不必担心在任何给定查询中实际请求了哪些字段。仅返回作为查询一部分请求的字段。如果一个字段是通过异步函数解析的,那么只有在请求该字段时才会执行该函数。
最后,客户端会返回与查询形状匹配的 JSON,但是(我希望)我们永远不会将这样的嵌套数据存储在 NoSQL 数据库中。还有一些工具,如dataloader,可以更轻松地通过批处理和缓存来优化查询。
GraphQL 倾向于依赖前端直接与数据通信的此类应用程序。
正如你可以从上面收集到的那样,情况并非如此。
推荐阅读
- javascript - 使谷歌翻译插件不跟踪访问者,除非他们要求它
- matlab - 直方图均衡代码生成索引错误
- python - Python 语句不按顺序执行?
- jquery - 在 wordpress 上更新主题版本后出现 Jquery 错误
- javascript - 如何格式化 Shiny 更新 numericInput 的输入但不更改实际值?
- html - 如何将数据从 hbs (html) 传递到 axios 发布请求?
- laravel - 如何在Vue中使用一个axios Post提交图像(formData)和字符串文本变量(数据)?
- spring-batch - 如何在spring批处理阅读器中记录导致运行时异常的数据
- jena - 使用RDFDataMgr写模型,但是用maven-assembly:assembly打包后,抛出NullPointerException
- python - 代码对黑客等级不起作用!在 Repl 和 Jupyter 上工作