Amazon 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

我必须设计一个表来存储DynamoDB中的公告。每份公告的结构如下:

{
    "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关于背景问题的答案:

    • 您预期接收的写入速率是多少(即您需要处理的每秒写入峰值)
    我不确定管理员将如何使用该系统,公告可以是非常定期(约3/天)或非常不频繁(约3/月)

    • 您预计每天存储多少新数据?您认为这将如何增长
    如上所述,这可能是一天三次或一个月三次。这很可能会保持不变,只要我应该关注

    • 读取速率是多少(例如,每秒峰值读取)
    我预计每秒读取的峰值大约为500-1000次读取/秒。随着用户数量的增加,这一数字有望增加

    • 用户一次可以看到多少条公告(即在任何时间点可以看到的公告的平均/最大数量是多少)?实际上,这不应该超过几个(例如最多10-20个)
    我预计可观看公告的最大数量将达到30-40条。这是因为可能会有多个长期公告和短期公告。平均而言,我预计会有5-10次公告

    • 在这里,您希望的数据不一致性差距是多少(即,您是否需要秒级精度,或者您是否希望在显示和隐藏公告时有约1分钟的延迟)

    我认为公告开始显示的速度很重要,特别是如果管理员认为这是一个紧急公告的好平台(可能是紧急到分钟)。然而,当它停止显示时就不那么重要了,但是为了避免混淆用户,公告应该在超过显示结束日期时间后最多4小时停止显示。

    这类问题在这里总是很难回答,因为对答案有太多假设,因为很难掌握所有事实。但我将尝试为您提供一些想法,这些想法可能会帮助您考虑数据存储的选择,并为您提供更多的选择

    我知道我在做什么,真的需要使用DynamoDB 根据OP对我原始问题的回答编辑此答案

    由于内部原因,您确实需要使用DynamoDB,因此我认为将数据存储在两个DynamoDB表中更合适,因为如果您有一个表,我所能想到的几乎所有访问模式都会影响多个分区。你可以通过GSI逃脱惩罚,但如何做到这一点并不太直截了当,我也不确定这样做是否有任何好处

    您需要优化的核心内容是您提到的读取量,它可以高达2K/rps,这足以使这一部分成为您优化架构的基础。基于您每天发布3条公告的假设,