使用falcor-router引用减少SQL查询的数量

时间:2016-06-22 19:37:45

标签: sql falcor falcor-router

假设我有两条falcor-routes

route: 'users[{ranges}]'

route: 'UserById[{integers:ids}]["name","email"]'

users返回对UserById - 路由的引用。如果我然后触发查询

get('users[0..10]["name","email"]')

对此,路由器将首先评估将在数据库上执行users[0..10]的{​​{1}}部分,并返回相应的ID。然后路由器将这些ID与特定路由一起使用以填充实际值。如果没有对UserService实现进行缓慢的缓存(对于任何类似的情况需要重复,例如地址,成本类型等),这将对我的持久性后端产生至少两个查询,这是一种使用单一的更传统的方法RESTful端点

SELECT id FROM users LIMIT 10

很可能只满足于一个。

在这种情况下,如何优化数据库查询是否存在一般的最佳实践方法,例如通过路由器和后端服务之间的一些聪明的缓存?返回模型的GET /users/?offset=0&limit=10 路径中已有的完整信息是不可取的,因为我们的用户可能拥有与用户自己的朋友的图表链接。

2 个答案:

答案 0 :(得分:0)

既不具有通用的逐个用户路由,又有一个用户名和电子邮件索引路由允许您使用单个数据库请求处理get('users[0..10]["name","email"]')查询?

E.g。

route: 'users[{ranges}]'

route: 'users[{ranges}]["name", "email"]'

第二个路由,因为它更具体,只返回一个数据库请求get('users[0..10]["name","email"]')查询所需的所有内容,而用户对任何其他字段(超出名称和电子邮件)的查询将会落到第一条路线。

答案 1 :(得分:0)

Jafar Hussain在引用文档时回答了here这个问题:

  

路由器适合作为服务层或REST API的抽象。在这些类型的API上使用路由器提供了足够的灵活性,可以避免客户端往返,而不会引入重量级的抽象。面向服务的体系结构在为可伸缩性而设计的系统中很常见。这些系统通常将数据存储在不同的数据源中,并通过各种不同的服务公开它们。例如,Netflix在其微服务架构之前使用路由器。

     

使用路由器直接访问单个SQL数据库非常理想。使用单个SQL存储的应用程序通常会尝试为每个服务器请求构建一个SQL查询。路由器的工作是将JSON Graph文档的不同部分的请求拆分为单独的处理程序,并将各个请求发送到服务以检索所请求的数据。因此,路由器很少有足够的上下文来生成单个优化的SQL查询。我们目前正在探索在Falcor中支持此类数据访问模式的不同选项。

我现在正在探索的是使用路由器收集部分数据库查询,然后抓取JSON Graph结果以合并这些部分查询,将它们作为一个对数据库执行,然后再次抓取图形以将值放在正确的道路。使用ArangoDB和AQL的LET语句肯定是可能的,尽管它有点棘手。我不知道SQL。

如果您正在寻找更简单的解决方案,可以缓存索引到id映射以尝试最小化数据库访问。 James Conkling的回答也很好。