api 与直接查询数据库相比如何

Posted

技术标签:

【中文标题】api 与直接查询数据库相比如何【英文标题】:How does an api compare to directly querying your database 【发布时间】:2020-03-09 01:12:29 【问题描述】:

我对何时需要 API 感到困惑。我最近创建了一个移动应用程序,其中包含 Flutter 和 Cloud Firestore 作为数据库,我只需在需要时查询并写入数据库。现在我正在学习全栈 Web 开发,我最近看了一个教程,他在其中构建了一个 Express API,具有 GET、POST 和 DELETE 功能,用于数据库中的一个简单项目。

来自我刚刚直接访问数据库的背景,我不确定为什么在这种情况下需要 API,是不是我不必每次都重写查询?这是一个非常简单的项目,所以他绝对不会制作第三方 api 供其他开发人员使用。我是否误解了 API 的确切作用?

真的很简单,MongoDB 数据库中有一个集合,他使用邮递员读取和写入数据库以检查它是否有效。

【问题讨论】:

【参考方案1】:

API 是您的前端(网络/移动)存储/获取应用程序信息的标准方式。您的前端可以/不应该直接访问数据库。了解前端的目的,即只显示界面并且应该做最少的处理。所有应用程序逻辑都应该在您的后端(API 服务器),通过 API(GET、POST 等)调用向您的前端公开。因此,要将项目存储在数据库中,您将在后端编写数据存储逻辑,并公开一个 API 端点,该端点在触发时将执行存储操作。您的前端应该使用该 API 调用来触发存储过程。这样,您的存储/数据库或任何其他事物的逻辑就不会暴露,只有 API URL 会暴露。前端的目的是公开,而后端/数据库不应该从前端公开和使用

【讨论】:

好的,但我不能只通过按钮单击或其他方式触发读取或写入,而不是让 API 处理它吗?所以你的意思是如果我这样做,客户端的用户可以访问我的数据库查询之类的东西还是什么?那些服务器端文档不是公开的吗? 客户端上的任何东西都是公开的,因此如果将您的所有数据库 URL 和密码放入前端,则可以提取。这只是原因之一。 好的,但是您可以让我们说在前端单击按钮或提交表单时将路由发送到服务器,然后服务器直接从数据库查询而不使用 api。查询存在于服务器上并且是私有的,所以我的问题是,如果您可以简单地从服务器直接访问数据库,为什么还要使用 api? 您没有正确理解它。 API 是一组进程,您的前端将使用这些进程访问将执行数据库事务的服务器(后端)。因此,在单击按钮时,将对后端服务器进行 API 调用。后端服务器将为该 API 调用编写一定的逻辑并执行某些操作,然后 API 调用将响应成功/错误返回给前端【参考方案2】:

可能适合您,不需要 API。但是,API 的用例很多。

例如:

您不必为每个平台编写业务逻辑。 (iosandroid、Web 等) 您的应用程序将是轻量级的,因为一些计算将被卸载到服务器。 可以对您的应用进行逆向工程以获取机密信息。 (或者,你的秘密算法可能是?) 如果您需要在文件系统中存储要与他人共享的内容,该怎么办?

也不错:Why we should use REST?

【讨论】:

所以您是说我不是直接对数据库执行 CRUD 操作,而是通过 api 和 http 方法处理客户端的请求,因为我不希望他们能够获取敏感信息?如果我这样做,他们怎么能得到任何敏感信息? 这只是用例之一。我见过很多高级安卓应用被开发者修改来解锁高级功能。它是通过逆向工程完成的。 另一个最重要的因素是耦合。添加到@Dijkstra API 提供了一种将逻辑彼此解耦的方法,从而允许更高的应用程序可靠性、可维护性、容错性以及如果需要的可扩展性。【参考方案3】:

在您的情况下,您使用的是预先编写的 SDK,它知道如何连接到 Firestore,在需要时缓存和更新应用程序数据,并提供在 Firestore 中读取、写入和删除数据的标准方法(以及相关文档以及来自 google 的示例数据)。

因此,使用 API(如 mongoDB 所述)不是必需的,也是不可取的。

在某些情况下,您可能不希望对 Firestore 集合或文档具有读取或写入权限,在这种情况下,您可以编写一个云函数,让您的应用使用参数调用该函数,以接收您想要的数据编写并执行超出云存储规则功能的某种检查或操作(尽管这些可能变得非常复杂)。见https://firebase.google.com/docs/firestore/security/get-started

托德(在此链接中包含的视频中)就这个主题做了一些很好的视频。

但是,这与您在问题中提到的 API 的工作方式不同。

因此,在使用 Firestore 的情况下,您应该使用 SDK,而不是通过创建自己的 API 重新发明***。

例如,如果您想分享照片,您还可以将它们存储在 Firebase 存储中,然后提供一个 URL 供其他设备在不安装您的应用的情况下访问它们。

如果您想向 Firestore 写入内容,然后发送给所有其他用户,那么您可以在每个应用上使用侦听器,数据将在到达 Firestore 后发送到应用。

https://firebase.google.com/docs/firestore/query-data/listen 对此进行了概述。

使用 Firebase 时要始终关注的一件事是做任何事情的成本。云函数的成本高于读取 Firestore 文档的成本。

这概述了 Firebase 功能集中不同功能的定价。

https://firebase.google.com/pricing

【讨论】:

所以你是说flutter的sdk已经有一个firebase api,所以当我编写简单的查询时它会处理所有这些东西?这就是为什么颤振实际上没有单独的客户端或服务器端,而是全部合二为一的原因吗?如果我想用 firestore 制作一个 web 应用程序,我需要编写我的 api 吗?或者有一个我可以使用类似的关键字,就像我在颤振中使用的那样。从我可以看到 mongodb 也有类似的查询语法,但是在本教程中我需要通过 http 方法获取和存储数据。所以我仍然对为什么我不能直接对按钮点击等执行 CRUD 操作感到困惑【参考方案4】:

另一个最重要的因素是耦合。添加到@Dijkstra API 提供了一种将逻辑彼此解耦的方法,从而允许更高的应用程序可靠性、可维护性、容错性以及如果需要的可扩展性。

因此这里没有对错之分,或者 API 与 DB 调用的比较本身并不能证明 从数据库中获取数据是最终目的。即使您使用 REST API 或查询数据库。

实现相同目标的方法可能因具体要求而异。例如,从井中取水。

如果您每天需要 1 桶水并且您是唯一的用户,您可以随时爬下井取一桶水。 但是,如果有很多用户,您会想要安装一个拉轮,人们使用它来将取水倒入他们的桶中,这同样取决于每天有 100 个用户使用或更多。因为这在超过 100 个用户的情况下不起作用。 如果整个社区(例如 1000 名用户)需要水,您可以采用更复杂的解决方案,即安装电动水泵将水抽出并通过管道将水供应到用户家中.这种解决方案有很多好处,例如快速供应、易于使用、过滤水、预定等。但实现该解决方案的成本和工作量也较高。

总而言之,这归结为成本与收益比率,只有您自己才能为不同的解决方案和特定问题制定图表,因为您是规模的最佳判断者和未来的用户流。


在此过程中,您可以就解决方案提出以下问题以帮助做出决定:

解决方案是否满足问题的主要要求? 构建它需要多长时间? 在我们构建解决方案所花费的时间里,它是否会以超过 75% 或更多的容量运行? 如果没有,我可以使用更简单的解决方案来解决问题并随着需求的增加对其进行扩展?

HTH。

【讨论】:

以上是关于api 与直接查询数据库相比如何的主要内容,如果未能解决你的问题,请参考以下文章

与 phpmyadmin 相比,$wpdb->get_results 查询返回不同(错误)的结果

与 SQL 相比,Hibernate JPQL 查询非常慢

与 c/c++ 相比,python API 需要多长时间才能完成相同的查询?

与用于日期查询的 Gmail Web UI 相比,Gmail API 未返回正确的电子邮件

与浏览器相比,通过 Node.js 的 HTTP 请求延迟

oracle查询语句中使用between and 查询效率高吗? 与to_char相比如何?