如何用数据库构造RESTful后端API?

如何用数据库构造RESTful后端API?,rest,Rest,我想使用REST制作一个API,它在数据库中交互(存储)数据 当我阅读一些设计模式时,我遇到了远程facade,我正在阅读的书中提到,该facade的作用是将远程调用中的过程粒度方法转换为细粒度本地调用,它不应该有任何额外的逻辑。作为解释,它说程序在没有这个外观的情况下仍然可以工作 但我有两个问题: 考虑到我还有一个数据库,将常规调用拆分为每个属性的特定调用有意义吗?使用一个通用的“获取数据”方法对数据库运行一个查询并将其转换为可用对象,以减少数据库调用的数量,这不是更有意义吗?因此,不要将

我想使用REST制作一个API,它在数据库中交互(存储)数据

当我阅读一些设计模式时,我遇到了远程facade,我正在阅读的书中提到,该facade的作用是将远程调用中的过程粒度方法转换为细粒度本地调用,它不应该有任何额外的逻辑。作为解释,它说程序在没有这个外观的情况下仍然可以工作

但我有两个问题:

  • 考虑到我还有一个数据库,将常规调用拆分为每个属性的特定调用有意义吗?使用一个通用的“获取数据”方法对数据库运行一个查询并将其转换为可用对象,以减少数据库调用的数量,这不是更有意义吗?因此,不要将get地址拆分为get street、get city、get zip,而是通过db call获取所有信息

  • 考虑到所有这些,在我使用golang的情况下,项目应该如何在文件和功能方面进行结构化

    • 我将拥有RESTAPI中所有端点的主文件,调用处理这些请求的控制器
    • 我将有一组定义这些控制器的文件。这些控制器是远程门面吗?在这种情况下,这些方法是否应该没有逻辑,只调用等价的局部方法
    • 本地方法应该直接调用数据库,还是应该使用某种访问数据库的助手类
假设所有问题都是肯定的,下面的结构有意义吗

  • 主要
  • 控制器
  • 领域
  • 数据库助手
如前所述

你的数据模型不是你的对象模型不是你的资源模型不是你的供给模型

Jim Webber确实说过,通过实现REST体系结构,您就有了一个集成模型,以Web的形式,由HTTP管理,另一个是域模型。尽管数据库中的数据和发送的表示之间没有1:1的映射,但参考资料能够熟练地将您的域模型投影到世界。典型的REST系统的资源确实比域模型中的DB条目多得多

话虽如此,但很难就如何构建项目给出具体建议,尤其是在您想要使用的特定框架方面。关于Robert“Bob叔叔”C.Martin关于代码结构的介绍,它应该告诉您应用程序的意图,而不是您使用的框架。据他说。尽管您通常看到的是Maven、RubyonRails等框架强加的默认结构。。。对于
golang
,您可能应该通读某些文档,这些文档可能会给您一些想法,也可能不会给您一些想法

在访问数据库方面,您可以尝试遵循微服务体系结构,其中每个服务维护自己的数据库,或者尝试像分布式整体一样作为一个内聚系统并在其所有部分之间共享数据库。如果您扩展到更广泛的范围,并且有两个并行服务使用数据,例如,对于MessageBroker,您可能需要一个分布式锁和/或队列来保证数据不会被多个实例同时使用

然而,您应该做的是以一种能够很好地扩展的方式来设计数据层。许多开发人员经常忘记或低估的是缓存带来的好处。链接基本上在Web上用于从一种资源到另一种资源的引用,并通过使用定义良好的链接关系名称为关系提供一些语义上下文。链接关系还允许服务器控制自己的命名空间,并根据需要更改URI。但是URI不仅是指向客户端可以调用的资源的指针,而且是缓存的键。缓存可以在多个位置上进行。在服务器端避免昂贵的计算或在客户端进行查找,以避免发送请求,或在中间跃点上发送请求,从而消除请求量大的服务器的压力。菲尔丁做出了需要尊重的决定

关于您应该为哪些属性创建查询,这完全取决于您试图描述的用例。对于给定的地址示例,一次返回所有地址信息是有意义的,因为很少单独查询街道或邮政编码。如果地址是某个用户或员工数据的一部分,则返回该信息是作为用户或员工数据的一部分,还是作为应作为进一步请求的一部分单独查询的链接,则更为模糊。您返回的内容还可能取决于媒体类型客户端的功能以及您的服务是否同意(内容类型协商)

如果您为一些足球运动员和他们所属的某些类别(例如他们的球队以及他们是进攻还是防守球员)实施类似于a的功能,那么您可能有一个
团队a
资源,其中包含所有球员作为嵌入数据。在DB中,您可以拥有自己的团队表和对相应玩家的引用,或者团队可以只是玩家表中的一列。我们不知道,而客户通常也不麻烦。然而,从设计的角度来看,您应该意识到同时包括所有参与者的好处和后果,即提供指向各个参与者的链接,或使用混合方法呈现一些基础数据和链接以了解更多细节

后一种方法可能是最明智的方法,因为这为客户提供了足够的信息,以确定是否需要更详细的数据。如果需要,向提供的U