11

像 Cassandra 这样的数据库和像 GraphQL 这样的方案能很好地协同工作吗?

Cassandra 的思想基于优化查询和非规范化数据的思想。这似乎与 GraphQL 意识形态不太吻合,在这种意识形态中,数据似乎可以在查询的每个级别访问。

示例:假设我像这样构建我的 Cassandra 表:

User:
    name
    address
    etc... (many properties)

Group:
    id
    name
    user_name  (denormalized user, where we generally just need the name of a user)

但是对于 GraphQL,它不会完全期望一个非规范化的用户。

query getGroup {
   group(id: 1) {
     name
     users {
         name
     }
   }
}

所以有几件事:1.)这个 GraphQL 查询最终可能会多次访问我们的 Cassandra 数据库(假设没有缓存)。获取组名和每个用户,我们甚至可以为每个用户点击它。但是假设我们的解决方案通过一个 cassandra 调用创建了多个用户对象。

2.) 我们不能真正构建一个考虑到非规范化和 graphql 的 cassandra 惯用数据库,可以吗?否则,我们应该期望用户的某些属性不会随查询返回给我们。

总结一下这个问题,处理非规范化数据的 graphql 策略是什么?忽略客户认为可以访问的某些属性是否可以接受?例如,客户端尝试访问用户的地址,但我们目前没有,因为我们的数据是非规范化的。或者甚至不应该担心非规范化,而只是让 graphQL 在 db 和 graphql 之间使用缓存机制进行调用。例如,graphql 首先获取组,然后获取组 id 的用户数据。

4

1 回答 1

0

这是 GraphQL 的副作用,其中查询在检索数据时会变得非常复杂。但只要用户真正请求他们需要的数据,如果你对解析器很聪明,最终结果实际上会更快。

在解析查询时考虑使用数据加载器等工具进行缓存。

至于省略某些属性,graphql 会验证响应并会引发错误,尽管它也会返回您提供的数据。如果在检索数据时出现问题,最好实现某种超时并抛出更具描述性的错误。

于 2018-07-11T16:15:32.297 回答