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