【问题标题】:Better way to connect to MongoDB from Android App从 Android 应用程序连接到 MongoDB 的更好方法
【发布时间】:2017-12-25 01:31:03
【问题描述】:

通过我的安卓应用程序,我通过mLab 连接到MongoDB 并寻求一些澄清。

根据mlab documentation,提到使用MongoDB Driver 以获得更好的安全性和性能,而不是使用mLab Data API

但是使用驱动程序直接从 Android 应用程序连接到 MongoDB 是一种好习惯吗?以下哪种方式更好?

  1. Mongo DB 驱动程序
  2. mLab Data API 并通过 Anroid App 使用(此 API 仅提供基本功能)
  3. 创建一个 Web API 并通过 Android 应用程序使用它

除此之外还有其他建议吗?

【问题讨论】:

  • 一对好读物herehere
  • "Application" 这里是 Web 应用程序,它很简单 - 你必须实现一个 API - 例如,你可以使用最新的 Spring/Webflux/Reactor + Asynchonous Mongo 驱动程序和主机获得一个非常快速的 API在谷歌或 AWS 中。大多数答案都是正确的,您所说的可靠来源是什么意思?我通常会做类似callicoder.com/reactive-rest-apis-spring-webflux-reactive-mongo 之类的事情(我不隶属于这个博客,它只是快速谷歌搜索显示我目前的方法)
  • 只是个人经验的一条建议:不要在高延迟网络上使用数据库查询。尝试批处理数据库查询,在数据库附近或数据库内部聚合结果,然后仅将结果返回到您的应用程序。否则,您最终会得到在实验室中运行良好的应用程序,但在现实世界中会非常缓慢。 (是的,仅此一项就已经是方法 3 的一个很好的理由。)

标签: android mongodb


【解决方案1】:

从问题中建议的选项来看,我认为第 3 个选项是唯一合理的选项。下面讨论:


  1. Mongo 数据库驱动程序

在 Android 中使用 mongoDB 驱动程序并不是一个好主意,原因有很多。

根据StackOverflow answer,该驱动程序与 Android 开箱即用不兼容。 有人有forked the project on Github,并使其与Android兼容,但该项目一年多没有更新。

在更高的层面上,数据库驱动程序并不是通过您无法控制的网络(尤其是移动设备)连接到数据库的好方法。

保护数据库内容也将更难(不可能?)。每个应用程序都可以访问所有数据库。如果数据库不存储任何私有数据,这可能没问题。另一个大的安全风险是您的应用程序将包含直接连接到数据库所需的凭据,这些凭据很容易获得。

此外,此解决方案将使 Android 应用程序依赖于数据库内部。拥有 API 会增加灵活性并保护应用。

这不是一个完整的列表,可能还有很多其他不在移动应用程序中使用数据库驱动程序的原因,这也取决于您正在构建的应用程序类型。

  1. mLab 数据 API

我对 mLab 的数据 API 不是很熟悉。从我通过阅读他们的文档收集到的信息来看,它看起来只是一个简单的 API,以防由于某种原因无法使用 mongo DB 驱动程序。

在这种情况下,使用 mongoDB 驱动程序的大多数问题也适用。您分发的应用程序必须包含您的 API 密钥,并且它们的文档说明:

Your API key will give full access to all data within the databases belonging to your mLab account. If you distribute it to untrusted individuals, they can gain access to your account and your data.

使用这种方法会使您的应用和数据库紧密耦合,并且无法为数据提供足够的保护。

  1. 创建一个 Web API 并通过 Android 应用程序使用它

自定义 API 是大多数应用解决此类情况的方式。 MongoDB's documentation 有几个现有框架的引用,可以通过 HTTP 与 mongoDB 数据库进行交互。建议使用这样的框架来实现稳健性、安全性和社区支持。

开发自定义 API 将为您提供更适合您的应用需求的解决方案,同时保持比其他选项更大程度的灵活性。它需要在后端进行一些工作,但它能够提供身份验证和授权,这是保护数据库及其内容的关键。

如果将来计划使用相同数据库的其他客户端(iOs/web/桌面应用程序、其他服务器...),那么设计您的 API 也会有很多优势。开发新客户会容易得多。在这种情况下,花在制作好的 API 上的努力将是一笔不错的投资。

额外选项

Stitch(也在另一个答案中引用)看起来是一个很好的解决方案,除非它永远不会从测试版中出来。很多东西都是开箱即用的,它允许一定程度的定制和灵活性。使用缝合可能有助于减少后端的工作量。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    我绝对强烈建议提供您自己的 Web API/restful API。好处是巨大的。我建议让你的 android 应用程序完全与 mongodb 无关。在你自己的 API 后面,你做你喜欢的事,你可能希望将来能够考虑迁移到另一个数据存储解决方案。您使您的应用程序更容易测试/模拟。如果你的 mongodb 死了怎么办?你如何缓存、优化、错误处理……事实上,你会希望在服务器上实现大量逻辑,而不一定要将所有逻辑都放在你的 android 应用程序上。您将如何构建一个 iPhone 应用程序,然后再构建一个 Web 应用程序?不直接使用 mongodb 有很多原因/优点。

    这个问题和反馈将为您提供更多建议和详细信息,说明为什么要考虑使用 REST API 而不是直接访问 mongodb:https://softwareengineering.stackexchange.com/questions/277701/why-do-people-do-rest-apis-instead-of-dbals

    关于考虑 Rest、Crud 或 web,我建议您阅读此处给出的建议:What is the advantage of using REST instead of non-REST HTTP?。这将为您提供有关可能从 Crud API Vs Rest 开始的信息。我觉得这可能会成为您要问的下一个问题。

    【讨论】:

      【解决方案3】:

      简单的答案是大不。您不应该连接到 MongoDB 或任何需要数据插入的数据库。考虑以下几点

      • 您可以为您的应用程序的多个用户存储数据,您如何阻止一个用户访问本地数据库并将其弄得一团糟?
      • 您还将为其他用户存储数据,这应该是安全的。将位置和 API 密钥提供给您的数据库位置会向所有人公开数据,并且您会失去任何控制权
      • 即使数据库访问是只读的,让我们假设您有一个只读的参考应用程序,但暴露您的数据库服务器的位置仍然是一个高风险。黑客可能能够在获得写访问权限后闯入数据库并更改完整的数据库。永远不要暴露数据库位置
      • 没有 API 意味着您需要在每个应用程序中编写所有可能的逻辑。如果您将来维护 iOS 和 android,那么您在两者中编写逻辑并在用户手机上保持更新时都会遇到问题。这又是一个大问题,因为您需要强制用户更新应用程序以获取可以在服务器端轻松完成的事情

      最后,是否有驱动程序可供您连接到 MongoDB 或其他任何东西都无关紧要,这不是您设计应用程序的方式。为您的用户设计一个安全的 API,而不是让他们面临使用此类不良做法的风险。

      PS:如果您正在构建一个您只会使用的应用程序,那么您可以考虑使用它。那为什么要使用 MongoDB?只需使用 SQLite 并将所有数据保存在应用程序本身中

      【讨论】:

      • 如果我想要 NoSQL 数据库但不想使用 firebase 数据库怎么办?在这种情况下,Mongodb 听起来不错。
      • 这个想法绝不是关于数据库限制,而是关于通过您的应用程序在本地连接到数据库
      【解决方案4】:

      尝试缝合。它仍处于测试阶段,目前您只能在 atlas 上使用它,但有时您也可以在本地使用它。请通过链接 https://www.mongodb.com/cloud/stitch

      【讨论】:

        【解决方案5】:

        从移动应用程序连接到您的数据库实例是BIG NO,任何人都可以对您的应用程序进行逆向工程,并且您的数据库实例容易受到攻击、数据泄露,太可怕了!!

        用您选择的语言编写一个简单的 CRUD 网络服务,并在您的应用程序中使用它们来访问数据库,为您的服务添加一些身份验证逻辑。

        有很多 Web 服务框架可以为您完成这项工作。

        不,选项 3 是可行的方法...

        【讨论】:

          猜你喜欢
          • 2020-04-10
          • 2018-09-29
          • 2020-05-08
          • 1970-01-01
          • 2019-04-18
          • 1970-01-01
          • 2023-03-10
          • 2023-04-10
          • 2014-12-30
          相关资源
          最近更新 更多