考虑一个简单的博客文章模式具有以下列
ID
Author
Category
Status
CreatedDateTime
UpdatedDateTime
所以假设以下查询
- 查询ID
- 作者查询,分页
- 通过(作者,状态(查询,由CreateDateTime分类,分页
- 通过(类别,状态(查询,由CreateDateTime分类,分页
所以似乎没有做太多工作,SimpleDB更容易实现代码?
SimpleDB几乎不受AWS的支持 - 您甚至无法在AWS控制台中找到它,因此,尽管它可能对您有用,但我个人会在Dynamphodb和DocumendDB之间做出决定(假设您想要nosql( - 在此时,没有任何理由在这样的旧产品上启动一个新项目。
您应该使用DynamoDB,因为它具有许多有用的功能,例如时间恢复点,交易,加密-AT-Rest和SimpledB没有的活动流。>
如果您在小规模上进行操作,DynamoDB的优势是您可以为桌子设置最大容量,这意味着您可以确保保持在免费层中。
如果您要大规模运行,dynamoDB会自动处理数据的所有分区(并且,并且出于所有实际目的,无限的容量(,而SimpledB的限制为每个域10 GB(又称"表"表"表"(,您需要管理跨您可能需要的域的任何水平分区。
最后,有一些迹象表明SimpleDB已经在折旧路径上。例如,如果您查看SimpleDB发行说明,您将看到最后一个更新是在2011年,而DynamoDB在上次RE:Invent Conference上宣布了几个新功能。此外,还有许多reddit帖子(例如,这里,这里和这里(,一般共识是SimpledB已经被弃用了,在某些线程中,Jeff Barr甚至发表了评论,并且没有任何矛盾的声明。简单B被弃用。
说,在DynamoDB中,您可以支持所需的查询。您将需要两个全局辅助索引,它们使用复合排序键。可以使用以下架构来支持您的查询:
-
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
则将其附加到最后。(在这里个人意见:使用ISO-8601时间戳,而不是UNIX时间戳。这将使故障排除更加容易。(
使用此模式,您可以满足所有查询。
查询ID:只需使用博客文章ID在主表上执行GetItem
请求。
作者查询,分页:用Author = :author
的关键条件表达式在Author-Status-CreatedDateTime-index
上执行Query
。
查询(作者,状态(,由CreateDateTime排序,分页:用Author = :author and begins_with(Status-CreatedDateTime, :status)
的关键条件表达式在Author-Status-CreatedDateTime-index
上执行Query
。结果将按顺序返回CreatedDateTime
。
查询(类别,状态(,由CreateDateTime分类,分页:用Author = :author and begins_with(Status-CreatedDateTime, :status)
的关键条件表达式在Category-Status-CreatedDateTime-index
上执行Query
。结果将按照上升CreatedDateTime
的顺序返回。(此外,如果您想在具有状态published
的"技术"类别中获取所有博客文章,并在2019年创建,则可以使用Category = "technology" and begins_with(Status-CreatedDateTime, "published#2019")
的关键条件表达式。
可以使用查询请求的ScanIndexForward
字段来控制结果的排序顺序。默认值为true
(排序升(;但是将其设置为false
DynamoDB将以降序返回结果。
DynamoDB已构建支持查询操作的结果。基本上,每当有更多结果未返回时,查询响应都会包含一个lastEvaluatedKey
,您可以将其传递到下一个查询请求中以接收您关闭的地方。(有关其工作方式的更多详细信息,请参见查询分页。(
另一方面,如果您已经熟悉SQL,并且想尽可能轻松地使其变得容易,请考虑仅使用Aurora无服务器数据API。