像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的用户数据。
发布于 2018-07-12 00:15:32
这是GraphQL的一个副作用,查询在检索数据时会变得非常复杂。但是,只要用户确实在请求他们需要的数据,如果您对解析器很聪明,那么最终结果实际上会更快。
在解析查询时,可以考虑使用像dataloader这样的工具进行缓存。
就忽略某些属性而言,graphql会验证响应并抛出一个错误,尽管它也会返回您给出的数据。如果在检索数据时出现问题,最好实现某种超时并抛出更具描述性的错误。
https://stackoverflow.com/questions/42336833
复制相似问题