DynamoDB相对于其他NoSQL数据库有哪些优缺点?

我们在Heroku上为我们的SaaS产品使用MongoDB数据库插件。 现在,亚马逊推出了DynamoDB,一个云数据库服务,我想知道如何改变NoSQL产品的景观?

特别是对于基于云的服务或SaaS供应商,与MongoDB相比,如何使用DynamoDB会更好还是更糟? 是否有成本,性能,可扩展性,可靠性,驱动程序,社区等使用一个与其他的好处?

对于初学者来说,它将由亚马逊的专家团队完全pipe理,所以你可以打赌,它将很好地扩展,而且几乎没有来自最终用户(开发者)的input。

此外,由于它由亚马逊build立和pipe理,你可以假设他们已经devise好了与他们的基础设施一起工作,所以你可以假设性能是一stream的。 除了专门为其基础架构而构build之外,他们还从一开始就select使用SSD作为存储,磁盘吞吐量将显着高于AWS支持HDD的其他数据存储。

我还没有看到任何驱动程序,我认为现在说社区如何对此作出反应还言之过早,但我怀疑亚马逊将拥有所有最受欢迎的语言的驱动程序,社区可能会收到这样的结果 – 反过来创build其他驱动程序和工具。

通过Heroku附加组件使用MongoDB可以有效地将MongoDB转变为SaaS产品。

事实上,人们可以比较所选供应商提供的服务与亚马逊可以提供的服务,而不是将一个持久性解决scheme与另一个持久性解决scheme进行比较

这很难做到。 每个提供商在不同的价格点都会有不同的服务级别,并且可以考虑在本地硬件上运行它以便进行开发,这是一个可喜的select。

我认为需要考虑的关键区别是MongoDB是一个可以安装在任何地方(包括AWS或其他云服务或内部)的软件,因为DynamoDB是专门作为Amazon(AWS)的托pipe服务提供的SaaS。 如果您想保留内部托pipe应用程序的选项,DynamoDB不是一个选项。 如果在AWS之外托pipe不是一个考虑因素,那么DynamoDB应该是您的默认select,除非非常具体的function是更高的考虑因素。

下面的链接中有一个表格,总结了DynamoDB和Cassandra的属性:

http://www.datastax.com/dev/blog/amazon-dynamodb

DynamoDB需要改进才能变得更加有用,这是为主键之外的列索引的可能性。

更新1(06/04/2013)

在2013年4月18日,亚马逊宣布支持本地二级索引,这使得DynamoDB变得非常好:

http://aws.amazon.com/about-aws/whats-new/2013/04/18/amazon-dynamodb-announces-local-secondary-indexes/

我必须诚实; 当我听说新的DynamoDB,并且昨天参加了networking研讨会时,我非常兴奋。 然而,现在做出决定是非常困难的,因为他们所说的一切都很模糊, 我不知道将通过他们的服务将被允许/使用的function。

我所知道的一件事就是自动处理缩放。 这是相当了不起的,但仍然有这么多的未知数,所以直到所有的事实都出现,我们才能开始使用它,真的很难做出真正的分析。

到目前为止,我仍然看到mongo在我一直在做的项目中对我(个人)的工作要好得多。

像大多数数据库决策一样,通过项目决定,最重要的是根据您的需求决定项目。

我急于等待有关产品的更多信息,至于现在它是在testing版,我不会跳船采取最新,最大的只是一个testing者:)

我认为DynamoDB和其他NoSQL产品之间的主要差异之一是预configuration的吞吐量 – 您在表上支付特定的吞吐量级别,并提供良好的数据分区,以便始终能够满足吞吐量。 因此,随着应用程序负载的增长,您可以扩大规模并保持性能不变。

Amazon DynamoDB看起来像一个相当不错的NoSQL解决scheme。 它速度快,使用起来非常简单。 除了拥有一个AWS账户,实际上并不需要任何设置或维护。 与MongoDB / CouchDB / Cassandra相比,function集和API相当小,但是随着开发者社区反馈的收到,我可能会期望随着时间的推移而增长。 目前,所有官方AWS开发工具包都包含一个DynamoDB客户端。

优点

  1. 快速闪电(内部使用SSD)
  2. 真的(真的)可靠。 (写入失败的几率较低)
  3. 无缝缩放(无需手动分片)
  4. 作为web服务工作(无服务器,无configuration,无安装)
  5. 与其他AWSfunction轻松集成(可以将整个表格存储到S3或使用EMR等)
  6. 复制是在内部进行pipe理的,因此意外丢失数据的机会可以忽略不计。

缺点

  1. 非常(非常)有限的查询。
  2. 扫描是痛苦的(我记得一次通过Java的扫描跑了6个小时)
  3. 预定义的吞吐量,这意味着超过设定吞吐量的突然增加将被限制。
  4. 吞吐量是分区的,因为表是在内部分区的。 (这意味着如果您的吞吐量为1000,并且其分区为2,并且如果您只读取最新数据(来自一个部分),则读取的吞吐量仅为500)
  5. 没有join,允许有限的索引(基本上是2)。
  6. 没有视图,触发器,脚本或存储过程。

作为可伸缩应用程序中的会话存储的替代品,它确实不错。 另一个好的用途是在广泛的系统中进行logging/审计。 function丰富的应用程序频繁增强或更改不适合