考虑一个简单的博客文章架构,其中包含以下各列
ID
Author
Category
Status
CreatedDateTime
UpdatedDateTime
所以假设以下查询
如此看来,如果不做很多工作,SimpleDB会更容易实现代码?
答案 0 :(得分:2)
SimpleDB几乎不再受AWS支持-您甚至无法在AWS控制台中找到它,因此尽管它可能对您有用,但我个人将在DynamoDB和DocumentDB之间做出决定(假设您想要NoSQL)-不要”认为目前没有任何理由在如此旧的产品上启动新项目。
答案 1 :(得分:1)
您应该使用DynamoDB,因为它具有SimpleDB不具备的许多有用功能,例如Point in Time Recovery,transactions,encryption-at-rest和activity streams。
如果您的规模较小,则DynamoDB的优势在于,它可以为表设置最大容量,这意味着您可以确保保持免费状态。
如果您要进行较大规模的操作,DynamoDB会自动处理数据的所有分区(并且出于所有实际目的具有无限容量),而每个域SimpleDB has a limit of 10 GB(又称为“表”)并且您需要管理可能需要的跨域的任何水平分区。
最后,有迹象表明SimpleDB已经在弃用路径上。例如,如果您查看SimpleDB release notes,将看到上一次更新是在2011年,而DynamoDB在上次re:Invent会议上宣布了一些新功能。另外,有许多Reddit帖子(例如here,here和here),其中普遍的共识是SimpleDB已被弃用,在某些线程中,{ {3}}甚至发表了评论,并且没有反对SimpleDB已过时的任何断言。
话虽如此,在DynamoDB中,您可以支持所需的查询。 您将需要两个Jeff Barr,它们使用一个Global Secondary Indexes。以下模式可支持您的查询:
ID
-您的表的哈希键Author
— Author-Status-CreatedDateTime-index
Category
— Category-Status-CreatedDateTime-index
Status
CreatedDateTime
UpdatedDateTime
Status-CreatedDateTime
— Author-Status-CreatedDateTime-index
和Category-Status-CreatedDateTime-index
的排序键。这是一个复合属性,可以用来启用某些查询。它只是带有分隔符的Status
的值(在本答案的其余部分中,我假设它是#
),并在末尾附加CreatedDateTime
。 (这里的个人意见:使用composite sort key时间戳记而不是unix时间戳记。这将使故障排除变得更加容易。)使用此架构,您可以满足所有查询。
按ID查询: 只需使用博客文章ID在主表上执行ISO-8601请求即可。
作者查询,分页:
使用关键条件表达式Author-Status-CreatedDateTime-index
在Author = :author
上执行GetItem
。
按(作者,状态)查询,按CreatedDateTime排序,分页:
使用关键条件表达式Query
在Author-Status-CreatedDateTime-index
上执行Author = :author and begins_with(Status-CreatedDateTime, :status)
。结果将按升序CreatedDateTime
返回。
按(类别,状态)查询,按CreatedDateTime排序,分页:
使用关键条件表达式Query
在Category-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。