【问题标题】:GraphQL,Cassandra and denormalization strategyGraphQL、Cassandra 和非规范化策略
【发布时间】:2017-07-09 06:37:36
【问题描述】:

像 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 的用户数据。

【问题讨论】:

    标签: facebook cassandra graphql graphene-python


    【解决方案1】:

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

    在解析查询时考虑使用dataloader 等工具进行缓存。

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

    【讨论】:

      猜你喜欢
      • 2016-05-13
      • 2018-07-31
      • 2016-05-27
      • 2015-02-01
      • 2021-06-13
      • 2019-05-11
      • 2013-11-04
      • 2016-10-22
      • 2017-10-23
      相关资源
      最近更新 更多