Amazon dynamodb 在两个日期时间之间存储和查询公告 背景
我必须设计一个表来存储DynamoDB中的公告。每份公告的结构如下:Amazon dynamodb 在两个日期时间之间存储和查询公告 背景,amazon-dynamodb,dynamodb-queries,Amazon Dynamodb,Dynamodb Queries,我必须设计一个表来存储DynamoDB中的公告。每份公告的结构如下: { "announcementId": "(For the frontend to identify an announcement to the backend)", "author": "(id of author)", "displayStartDatetime": "", "displayEndDatetime": "", "title": "", "descriptio
{
"announcementId": "(For the frontend to identify an announcement to the backend)",
"author": "(id of author)",
"displayStartDatetime": "",
"displayEndDatetime": "",
"title": "",
"description": "",
"image": "(A url to an image)",
"link": "(A single url to another page)"
}
由于我们仍在设计桌子,允许对结构进行修改。特别是,announcementId
、displayStartDatetime
和displayEndDatetime
可以更改
主要的访问模式是查找当前公告。用户有一个网页,可以查看所有当前公告及其详细信息
每个公告都有开始显示它的日期(displayStartDatetime
)和停止显示它的日期(displayEndDatetime
)。在当前日期时间超过displayEndDatetime
后,公告仍应保留在表中,以供管理员参考
开始和结束日期时间精确到分钟
问题
理想情况下,我想要一种在一个查询中查询表中所有当前公告的方法
但是,我得出的结论是,不可能在一个排序键中融合两个日期时间,因为不可能对两个同等重要的数据进行排序(例如,将时间戳存储为字符串将意味着一个比另一个更重要/更大)
因此,作为一种折衷办法,我想按displayEndDatetime
对表值进行排序,以便过滤掉过去的公告。这是因为,随着时间的推移,过去的公告将多于未来的公告,因此优化这一点将更加有益
折衷方案
目前,我的(不是很好)解决方案是:
displayEndDatetime
作为排序键扫描整个表格
Scan
会在执行任何筛选之前查看表中的每个项目。这个解决方案似乎不如1好。但这是最简单的实现,它允许我保留announcementId
作为分区键
扫描表的GSI
Scan
将查看每个项目,因此创建GSI(announcementId(PK),displayEndDatetime(SK)
)并对其进行扫描以检索所有未通过的announcementId
可能更有效。之后,可以提出另一个请求来获取所有公告
问题:
在使用DynamoDB时,存储所有公告并查找当前公告的最佳解决方案是什么
虽然我列出了一些排序displayEndDatetime
的可能解决方案,但重点仍然是在开始日期时间和结束日期时间之间查找公告
编辑
以下是@tugberk关于背景问题的答案:
- 您预期接收的写入速率是多少(即您需要处理的每秒写入峰值)
- 您预计每天存储多少新数据?您认为这将如何增长
- 读取速率是多少(例如,每秒峰值读取)
- 用户一次可以看到多少条公告(即在任何时间点可以看到的公告的平均/最大数量是多少)?实际上,这不应该超过几个(例如最多10-20个)
- 在这里,您希望的数据不一致性差距是多少(即,您是否需要秒级精度,或者您是否希望在显示和隐藏公告时有约1分钟的延迟)
我认为公告开始显示的速度很重要,特别是如果管理员认为这是一个紧急公告的好平台(可能是紧急到分钟)。然而,当它停止显示时就不那么重要了,但是为了避免混淆用户,公告应该在超过显示结束日期时间后最多4小时停止显示。这类问题在这里总是很难回答,因为对答案有太多假设,因为很难掌握所有事实。但我将尝试为您提供一些想法,这些想法可能会帮助您考虑数据存储的选择,并为您提供更多的选择 我知道我在做什么,真的需要使用DynamoDB 根据OP对我原始问题的回答编辑此答案 由于内部原因,您确实需要使用DynamoDB,因此我认为将数据存储在两个DynamoDB表中更合适,因为如果您有一个表,我所能想到的几乎所有访问模式都会影响多个分区。你可以通过GSI逃脱惩罚,但如何做到这一点并不太直截了当,我也不确定这样做是否有任何好处 您需要优化的核心内容是您提到的读取量,它可以高达2K/rps,这足以使这一部分成为您优化架构的基础。基于您每天发布3条公告的假设,