Amazon SimpleDB和DynamoDB用于存储博客文章

时间:2019-05-20 16:31:59

标签: amazon-dynamodb amazon-simpledb

考虑一个简单的博客文章架构,其中包含以下各列

ID 
Author 
Category 
Status 
CreatedDateTime
UpdatedDateTime

所以假设以下查询

  • 通过ID查询
  • 作者查询,分页
  • 按(作者,状态)查询,按CreatedDateTime排序,分页
  • 按(类别,状态)查询,按CreatedDateTime排序,分页

如此看来,如果不做很多工作,SimpleDB会更容易实现代码?

2 个答案:

答案 0 :(得分:2)

SimpleDB几乎不再受AWS支持-您甚至无法在AWS控制台中找到它,因此尽管它可能对您有用,但我个人将在DynamoDB和DocumentDB之间做出决定(假设您想要NoSQL)-不要”认为目前没有任何理由在如此旧的产品上启动新项目。

答案 1 :(得分:1)

您应该使用DynamoDB,因为它具有SimpleDB不具备的许多有用功能,例如Point in Time Recoverytransactionsencryption-at-restactivity streams

如果您的规模较小,则DynamoDB的优势在于,它可以为表设置最大容量,这意味着您可以确保保持免费状态。

如果您要进行较大规模的操作,DynamoDB会自动处理数据的所有分区(并且出于所有实际目的具有无限容量),而每个域SimpleDB has a limit of 10 GB(又称为“表”)并且您需要管理可能需要的跨域的任何水平分区。

最后,有迹象表明SimpleDB已经在弃用路径上。例如,如果您查看SimpleDB release notes,将看到上一次更新是在2011年,而DynamoDB在上次re:Invent会议上宣布了一些新功能。另外,有许多Reddit帖子(例如hereherehere),其中普遍的共识是SimpleDB已被弃用,在某些线程中,{ {3}}甚至发表了评论,并且没有反对SimpleDB已过时的任何断言。


话虽如此,在DynamoDB中,您可以支持所需的查询。 您将需要两个Jeff Barr,它们使用一个Global Secondary Indexes。以下模式可支持您的查询:

  • ID-您的表的哈希键
  • AuthorAuthor-Status-CreatedDateTime-index
  • 的哈希键
  • CategoryCategory-Status-CreatedDateTime-index
  • 的哈希键
  • Status
  • CreatedDateTime
  • UpdatedDateTime
  • Status-CreatedDateTimeAuthor-Status-CreatedDateTime-indexCategory-Status-CreatedDateTime-index的排序键。这是一个复合属性,可以用来启用某些查询。它只是带有分隔符的Status的值(在本答案的其余部分中,我假设它是#),并在末尾附加CreatedDateTime。 (这里的个人意见:使用composite sort key时间戳记而不是unix时间戳记。这将使故障排除变得更加容易。)

使用此架构,您可以满足所有查询。

按ID查询: 只需使用博客文章ID在主表上执行ISO-8601请求即可。

作者查询,分页: 使用关键条件表达式Author-Status-CreatedDateTime-indexAuthor = :author上执行GetItem

按(作者,状态)查询,按CreatedDateTime排序,分页: 使用关键条件表达式QueryAuthor-Status-CreatedDateTime-index上执行Author = :author and begins_with(Status-CreatedDateTime, :status)。结果将按升序CreatedDateTime返回。

按(类别,状态)查询,按CreatedDateTime排序,分页: 使用关键条件表达式QueryCategory-Status-CreatedDateTime-index上执行Author = :author and begins_with(Status-CreatedDateTime, :status)。结果将按升序CreatedDateTime返回。 (此外,如果要获取状态为published且于2019年创建的所有“技术”类别中的博客文章,则可以使用关键条件表达式Category = "technology" and begins_with(Status-CreatedDateTime, "published#2019")

可以使用查询请求的ScanIndexForward字段控制结果的排序顺序。默认值为true(升序排列);但是将其设置为false时,DynamoDB将以降序返回结果。

DynamoDB内置了对查询操作的结果进行分页的支持。基本上,只要有更多未返回的结果,查询响应就会包含一个lastEvaluatedKey,您可以将其传递到下一个查询请求中以从上次中断的地方接听。 (有关其工作原理的更多信息,请参见Query。)


另一方面,如果您已经熟悉SQL,并且想使自己尽可能简单,请考虑只使用Query Pagination