使用 falcor-router 引用减少 SQL 查询的数量
Posted
技术标签:
【中文标题】使用 falcor-router 引用减少 SQL 查询的数量【英文标题】:Reduce number of SQL queries with falcor-router references 【发布时间】:2016-10-24 21:58:48 【问题描述】:假设我有两条 falcor 路线
route: 'users[ranges]'
和
route: 'UserById[integers:ids]["name","email"]'
而users
返回对UserById
路由的引用。如果我然后触发查询
get('users[0..10]["name","email"]')
与此相反,路由器将首先评估users[0..10]
部分,该部分将对数据库执行SELECT id FROM users LIMIT 10
并返回相应的ID。然后,路由器将使用这些 id 和特定路由来填充实际值。如果在 UserService 实现上没有 akward 缓存(对于任何类似情况,例如地址、成本类型等,都需要重复缓存),这将针对我的持久性后端产生至少两个查询,而更传统的方法使用单个RESTful 端点
GET /users/?offset=0&limit=10
很可能会满足于一个单一的。
是否有一种通用的最佳实践方法如何在这种情况下优化数据库查询,例如通过路由器和后端服务之间的一些巧妙的缓存?返回模型的users
路径中已经存在的完整信息是行不通的,因为我们的用户可能拥有指向用户本身的朋友的图形链接。
【问题讨论】:
【参考方案1】:难道不能同时拥有一个通用的按索引用户路由和一个按索引的用户名和电子邮件路由允许您使用单个数据库请求处理get('users[0..10]["name","email"]')
查询吗?
例如
route: 'users[ranges]'
和
route: 'users[ranges]["name", "email"]'
第二条路线,因为它更具体,只返回一个数据库请求的get('users[0..10]["name","email"]')
查询所需的所有内容,而用户对任何其他字段(除了姓名和电子邮件)的查询将落入第一条路线。
【讨论】:
【参考方案2】:Jafar Hussain 引用文档回答了这个问题here:
路由器适合作为服务层或 REST API 的抽象。在这些类型的 API 上使用路由器提供了足够的灵活性来避免客户端往返,而无需引入重量级抽象。面向服务的体系结构在为可扩展性而设计的系统中很常见。这些系统通常将数据存储在不同的数据源中,并通过各种不同的服务公开它们。例如,Netflix 在其微服务架构前使用了路由器。
使用路由器直接访问单个 SQL 数据库并不理想。使用单个 SQL 存储的应用程序通常会尝试为每个服务器请求构建单个 SQL 查询。路由器的工作是将 JSON Graph 文档的不同部分的请求拆分为单独的处理程序,并将单独的请求发送到服务以检索请求的数据。因此,路由器很少有足够的上下文来生成单个优化的 SQL 查询。我们目前正在探索未来在 Falcor 中支持此类数据访问模式的不同选项。
我自己现在正在探索的是使用路由器收集部分数据库查询,然后爬取 JSON 图形结果以合并这些部分查询,将它们作为一个数据库执行,然后再次爬取图形以将值放置在正确的道路。使用 ArangoDB 和 AQL 的 LET
语句绝对是可能的,尽管它有点棘手。我不知道 SQL。
如果您正在寻找更简单的解决方案,您可以缓存 index-to-id 映射以尽量减少数据库访问。 James Conkling 的回答也不错。
【讨论】:
以上是关于使用 falcor-router 引用减少 SQL 查询的数量的主要内容,如果未能解决你的问题,请参考以下文章