Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 有两个应用程序可以查询一个数据库吗_Database_Api_Rest - Fatal编程技术网

Database 有两个应用程序可以查询一个数据库吗

Database 有两个应用程序可以查询一个数据库吗,database,api,rest,Database,Api,Rest,首先我要为我的英语不好道歉 我正在开发一种API,它提供来自本地数据库的数据。 数据库中的数据由另一个应用程序(称为CMS)管理。API需要在不使用CMS的情况下运行(客户希望) 有两种方法可以管理API数据库中的数据 第一种方法是CMS从“API后端”调用RESTAPI,后者更新API数据库。同一个“API后端”通过rest API将数据库中的数据提供给API网关,从而使整个事情具有可伸缩性并管理API密钥等等 在第二种方式中,CMS直接管理API数据库中的数据,“API后端”通过rest连

首先我要为我的英语不好道歉

我正在开发一种API,它提供来自本地数据库的数据。 数据库中的数据由另一个应用程序(称为CMS)管理。API需要在不使用CMS的情况下运行(客户希望)

有两种方法可以管理API数据库中的数据

第一种方法是CMS从“API后端”调用RESTAPI,后者更新API数据库。同一个“API后端”通过rest API将数据库中的数据提供给API网关,从而使整个事情具有可伸缩性并管理API密钥等等

在第二种方式中,CMS直接管理API数据库中的数据,“API后端”通过rest连接将数据库中的数据提供给API网关,该网关是“同一故事”

在这种情况下,“API后端”只从数据库读取数据,因此两个应用程序不可能尝试在同一条记录上写入数据

现在我的问题是: 这两种方法中的一种或两种是解决我“问题”的正确(通常)方法吗? 我选择第一种解决方案,我的一位同事选择第二种

我说从另一个应用程序查询数据库是不整洁的。他说,在第二种情况下,您需要少编程1个API(与CMS通信的API),这样可以节省时间


在我们的情况下,时间不是问题,但当它是整洁的时候,它需要的时间比我们要少。

您描述的体系结构通常被称为“”或“无头CMS”。它正在成为一种流行的设计——它允许您在网站、移动应用程序、信息亭等中使用您的内容,并且——理论上——将您的网站与CMS供应商分离

当你说“CMS”时,我假设你是自己构建的,而不是使用现成的解决方案。如果是这样的话,我会考虑先看看现成的货架。它几乎肯定会比你自己写的任何东西都更便宜、更快、更好

然而,如果您是自己构建的,那么您的问题可以归结为“面向服务”与“面向数据”的设计。一般来说,将这两种模式结合起来是有风险的——这会使应用程序更复杂,因此更容易出现错误。对于小型应用程序,这可能不是什么大问题,但对于大型、长寿命或业务关键型应用程序,这是一件坏事

这可能有助于思考CMS的一项基本任务——编辑现有文章

在面向服务的设计中,CMS代码类似于:

article = articleService.get(id)
application.render(article)
onSave(article)
  articleService.put(article)
在混合设计中,它可能看起来像

article = articleService.get(id)
application.render(article)
onSave(article)
  db.updateArticleHeader(date, user, article.metaData.title, article.metaData.byLine)
 forEach(article.Header.keywords)
   if not (db.getArticleKeywords.contains (keyword))
     db.addArticleKeyword(keyword)
 next
 db.updateArticleBody(article.body)
(当然,这就省去了所有的数据库逻辑)。CMS应用程序中有更多的代码和更多的逻辑

现在想象一下,当您向文章添加另一个属性时会发生什么情况—您必须更新CMS中的DB层、渲染层和业务逻辑层

如果你有一个面向服务的方法,如果运气好的话,你只需要改变服务层

“整洁”通常不是评价软件的有用方法。最好使用已建立的非功能性需求:

  • 性能:混合模型可能更快,因为它删除了API 层
  • 开发时间:对于简单的应用程序,混合模型可能更快 解决;对于复杂的应用程序,它的构建速度可能更快 API层和集中式逻辑
  • 可维护性和可扩展性:面向服务的方法通常(更)适用于除普通应用程序以外的任何应用程序

实际上,这两种情况非常接近。它可以归结为是直接写入数据库还是通过另一层写入。其余的都一样

所以,我会遵循接吻原则,选择最简单的解决方案。。。不一定是这个或那个。这可能取决于您的技术堆栈和当前代码

除此之外,两种方案之间的两个关键区别是

用于直接数据库访问

  • 它的快速和高度定制。您可以轻松地优化查询。对于大数据来说非常方便
用于通过REST API访问

  • 这里,您有另一个通过序列化/网络/反序列化的过程。这很可能是一个可以忽略不计的开销,但如果你用请求轰炸它,这是值得一提的
  • 如果您必须更改写入数据的内容或方式,您可能需要调整两个位置:CMS和后端API
  • 通过后端API提供了一种简单的方法来应用通用的东西(日志记录、统计、验证、监控…),以备不时之需。否则,算了吧,雅格尼
  • …如果其他服务也需要此REST API,它可能会很有用…否则,YAGNI
Basicali,我会选择任何对你来说更简单的方式


反正也没什么大不了的。您可以在接口后面抽象它,以便随时交换它是通过RESTAPI还是到DB。只要将一点代码从DB访问层移植到后端API,或者反之亦然,只要它是同一种语言。

谢谢,“我们”创建自己的CMS是对的。我们考虑了现有的CMS,但没有人能够满足我们的要求和功能。此软件应用程序具有许多特定的愿望和功能。我想你的意思是“你描述的架构”是我问题的第一种情况。我从没听说过你说的建筑。我会做一些调查。我不完全理解这部分“现在想象一下,当您向文章添加另一个属性时会发生什么情况-您必须更新CMS中的DB层、渲染层和业务逻辑层。如果你有面向服务的方法,运气好的话,你只需要改变服务层