REST API关系,模块化(多个请求)获取与使用SQL连接聚合(单个请求)获取的优缺点

REST API关系,模块化(多个请求)获取与使用SQL连接聚合(单个请求)获取的优缺点,sql,postgresql,rest,api,Sql,Postgresql,Rest,Api,通常从我所看到的情况来看,RESTAPI是以模块化的方式实现的。例如,假设我们在保存RSS源的数据库上构建API,那么获取这些源和项将需要以下操作: +-----------+--------------------+ | REST | SQL | +-----------+--------------------+ | GET /feed | SELECT * FROM feed | +-----------+--------------------+

通常从我所看到的情况来看,RESTAPI是以模块化的方式实现的。例如,假设我们在保存RSS源的数据库上构建API,那么获取这些源和项将需要以下操作:

+-----------+--------------------+
|   REST    |        SQL         |
+-----------+--------------------+
| GET /feed | SELECT * FROM feed |
+-----------+--------------------+
然后是类似于

+-------------------------+-----------------------------------------------+
|          REST           |                      SQL                      |
+-------------------------+-----------------------------------------------+
| GET /feed/1/item        | SELECT * FROM item WHERE feed_id = 1          |
| GET /item?feed_id=1,2,3 | SELECT * FROM item WHERE feed_id IN (1, 2, 3) |
+-------------------------+-----------------------------------------------+
如果你想做,如果你想一次做一件,或者分别做一件


我想知道的是,减少模块化程度,并使用连接和聚合来实现它是否有任何好处,例如,如果您事先知道您需要一个聚合,那么您会使用

+--------------+---------------------------------+
| REST         | SQL                             |
+--------------+---------------------------------+
| GET /feedagg | SELECT                          |
|              |   f.*,                          |
|              |   json_agg(i.*) as items        |
|              | FROM feed f                     |
|              | JOIN item i USING (feed_url)    |
|              | GROUP BY f.feed_url             |
|              | ORDER BY f.title ASC            |
+--------------+---------------------------------+
这是更多的SQL,但另一方面,它只是一个SQL查询和一个API请求


我知道这两种方法可以共存,因为我把它们放在不同的路径下,但我不清楚的是,第二种方法是否比第一种更好。由于请求/查询计数较少,这似乎更好,但我找不到详细说明这一点的参考资料

关于第一个模块化方法,有大量的例子,但相比之下,人们在网上使用连接+聚合的例子严重不足。我没有经验,我知道有很多因素在起作用,包括我可能没有想到的因素

可能性能差异可以忽略不计,但不管怎样,我想对这两种方法进行正反两方面的分析。有人能帮我澄清一下吗?

一般来说,由于准备两个单独查询的开销,1个API查询将比2个快,但您是否能利用这一优势取决于您的API将如何使用

如果您的用户不打算通过
GET/feedagg
方法使用API,那么在性能方面就没有明显的好处

您提到的模块化是REST的关键原则,REST将API划分为逻辑
资源
。从实用角度讲,坚持使用模块化方法,除非您的API总是以第二种方式使用,在这种情况下,您可以这样做以实现它提供的性能优势


这里有一个关于实用RESTful API开发的很好的资源:

哪一个更好取决于您的客户端需求和应用程序实现。理想情况下,您应该使用第一种方法,因为它更灵活、更易于标准化,并且可以解决缓存的任何性能问题。第二种方法可能会为您节省一个请求,但根据您的API,可能会迫使您为所有资源实现这样一个聚合的集合资源

我在某些情况下使用的另一种方法是我称之为“缩放协议”。您允许您的资源在
嵌入的
属性中嵌入子资源,并且
\u zoom
查询参数告诉API要嵌入多少级别。例如,假设您使用的是JSON表示形式,
GET/feed/1?\u zoom=1
将返回feed的表示形式,并将所有项和任何其他子资源作为数组嵌入
embedded
属性中。使用
GET/feed/1?\u zoom=2
返回所有项目和项目的子项,依此类推


一种更复杂的方法是提供一种标准的查询语法,客户机可以使用该语法来查询他们想要的资源,在URL查询字符串中复制一些简单的SQL查询。这在某些情况下非常有用,但在另一些情况下则是一种负担。该语言是一种查询语言,可用于实现类似的功能

REST的目标通常是处理ResourceC,人们通常会考虑将其映射到POCO/业务实体。另一种方法是考虑作为资源的数据的查询/视图(如DDD/CQRS)。在这种情况下,拥有特定REST端点的数据视图是有意义的。另外,在写侧,可以将命令/动作视为自身的资源。GET查询域的状态,POST发送一个命令,该命令反过来修改域。我认为在这一点上,我更愿意将其用作模块化REST端点的抽象。当然,但GraphQL是RPC,而不是REST。如果这是您想要的,那么没有问题,但是使用RQL,您可以有类似的查询,并且仍然是RESTful的,如果您需要的话。