你应该使用 DynamoDB 还是 MongoDB?

2021-07-24 21:39:11

在我的职业生涯中,我主要使用 MongoDB,所以我决定在我当前的项目中使用 DynamoDB。这是我的发现。将 DynamoDB 设置为与其他 Amazon 服务(例如 EC2)一起使用非常简单。访问数据库不需要 AWS 密钥。相反,为 EC2 实例分配正确的 DynamoDB IAM 角色,它将自动拥有对数据库的正确访问权限。 DynamoDB 的连接代码非常简单,如下面的代码示例所示。使用 MongoDB 设置,我们最终会得到更多的代码语句,但是,设置仍然非常简单,如下面的示例所示。主要区别在于 MongoDB 连接 URI 需要设置为环境变量,以便应用程序访问数据库。 MongoDB 和 DynamoDB 库的结构非常不同,这使得某些查询不太方便。在接下来的示例中,我们将使用 JavaScript 作为编写查询的基础。

使用 MongoDB 编写查询非常简单,不需要特定的预设置。唯一需要确保的是正确设置索引以确保高性能查询。最坏的情况是,始终可以在任何时间点添加索引。获取查询、通过电子邮件地址和电话号码获取用户的示例如下: 使用 DynamoDB,我们需要更加小心。初始设置需要深思熟虑,因为过滤或搜索不同的字段最终可能需要更改初始设置!更改表的设置需要您删除并重新创建它。可以想象,这并不理想。通过电子邮件地址和电话号码获取用户的示例查询如下所示。到目前为止一切顺利,对吧?这似乎很容易吸引用户!问题来了。数据定义了作为查询的一部分发送到 DynamoDB 的主键。这意味着这只适用于主键!主键在获取数据方面非常高效,但 AWS 只允许您为每个表定义最多 2 个键,即分区键和排序键。组合起来,这些被称为复合键。

到目前为止,我们已经确认使用 DynamoDB 通过主键获取数据很容易。让我们尝试复制我们用 MongoDB 制作的示例,其中我们选择的数据不一定是键,而是可能是索引列。这将类似于之前的 MongoDB 查询。有一些关键的区别。使用 DynamoDB,我们需要明确发送类似 SQL 条件的过滤器表达式。当我们想按主键过滤时,需要在对象的key字段中明确指定key。但是,使用 MongoDB,就像根据您的要求传递对象一样简单。就是这样,没有多余的大惊小怪。至少,如果 DynamoDB 有一些 API 允许我们从对象自动生成过滤器表达式,那就太好了。这将是一个非常受欢迎的改进,而不是让每个客户端应用程序都编写这个过滤器生成代码。为了避免编写表达式过滤器一遍又一遍地生成代码,我创建了一个名为 Dynamongo 的小型开源库。其目标是为开发人员简化 DynamoDB 查询语法,从而自动生成表达式过滤器。基本功能已经可用,可以更轻松地查询 DynamoDB 数据,但是,仍有很多项目可以添加。如果您发现任何缺失的功能,请随时向存储库发送拉取请求! MongoDB 的定价是在云中运行 MongoDB 服务器的价格。无论查询多少次,服务器的成本都是一样的,除非你升级它。

MongoDB Atlas 正在推出一项名为 serverless 的新功能,目前处于预览阶段。 MongoDB 无需为服务器付费,而是在它们运行的​​任何可用服务上运行您的查询。其定价降至 0.30 美元/百万读取请求,以及数据存储和写入请求的额外成本。 AWS 的 DynamoDB 的工作方式类似于 MongoDB Atlas Serverless 模式。您无需支付运行具有特定容量的实例的费用。相反,您纯粹为进入数据库的请求数量付费。在撰写本文时,美国俄亥俄州东部的价格降至 0.25 美元/百万读取请求。请记住,成本不仅仅是读取请求。写请求和存储成本也应该牢记在心。如果您想了解有关典型 AWS 定价的更多信息,我们为此专门撰写了一篇文章!虽然查询 API 是 AWS 仍然可以在 DynamoDB 上改进的东西,但对于托管在 AWS 上的应用程序来说,它仍然是一个了不起的选择。与 AWS 服务的集成水平非常高。此外,在成本方面,您实际上只需为使用的内容付费。 MongoDB 很棒,并提供了非常直观的查询 API,但是,MongoDB Atlas 主要提供的是一种非常不同的定价策略。无论您实际使用什么,您实际上都为缩放付费。除非您使用无服务器 MongoDB 选项,否则迁移到更昂贵的 MongoDB 实例可能会很昂贵,该选项仍处于预览阶段。这是否意味着您应该只使用 DynamoDB,或者只将 MongoDB 用于您的所有项目?一点也不。这是我们可以使用的两个很棒的数据库引擎,它们都有自己的优点和缺点。选择数据库引擎和托管是任何项目的重要技术决策。根据您的项目标准,一个可能比另一个更适合。

为了方便使用,我们还是更喜欢MongoDB。更复杂的功能会有更多的差异,我们可以在下一篇文章中进行比较。至于定价,MongoDB 现在提供了无服务器选项,尽管它仍处于预览阶段。它不提供 AWS 与其他 AWS 服务的紧密集成。我将继续在我的项目中使用 DynamoDB,纯粹是为了与 AWS 的紧密集成以及非常可扩展的定价模型。这是获得更多 DynamoDB 经验的完美借口!