Amazon dynamodb 时间序列数据的高效DynamoDB模式

Amazon dynamodb 时间序列数据的高效DynamoDB模式,amazon-dynamodb,database,nosql,Amazon Dynamodb,Database,Nosql,我们正在构建一个对话系统,该系统将支持2个用户之间(最终支持3个以上用户之间)的消息。每个对话都有一组可以参与/查看对话的用户以及一组消息。用户界面将显示特定对话中最近的10条消息,并能够“翻页”(渐进滚动?)这些消息以查看时间更远的消息 计划是在MSSQL中存储对话和参与者,然后只在DynamoDB中存储消息(表示可能增长非常大的数据)。消息表将使用会话ID作为散列键,使用消息CreateDate作为范围键。会话ID可以是此时的任何内容(整数、GUID等),以确保跨分区均匀分布消息 为了避免热

我们正在构建一个对话系统,该系统将支持2个用户之间(最终支持3个以上用户之间)的消息。每个对话都有一组可以参与/查看对话的用户以及一组消息。用户界面将显示特定对话中最近的10条消息,并能够“翻页”(渐进滚动?)这些消息以查看时间更远的消息

计划是在MSSQL中存储对话和参与者,然后只在DynamoDB中存储消息(表示可能增长非常大的数据)。消息表将使用会话ID作为散列键,使用消息CreateDate作为范围键。会话ID可以是此时的任何内容(整数、GUID等),以确保跨分区均匀分布消息

为了避免热分区,建议为时间序列数据创建单独的表,因为通常只访问最新的数据。当用户滚动/翻页时,我们需要为他们收回以前的消息,因为我们必须跨多个表查询以拼凑一批消息时,这会导致问题吗


是否有一种不同/更好的方法来存储可能不经常访问但很快可用的时间序列数据?

我想我们可以假设有许多“活动”对话并行进行,对吗?意思-我们不是在处理所有流量都与一次(或几次)对话有关的情况

如果是这种情况,并且使用随机数/GUID作为散列键,那么对象将均匀分布在所有节点上,据我所知,您不应该害怕偏斜。由于
CreateDate
只是范围键,因此同一对话的所有消息都将存储在同一节点上(基于它们的
ConversationID
),因此实际上查询最新的5条记录还是最早的5条记录并不重要。在这两种情况下,都是使用
CreateDate
上的索引进行查询

我不会把数据分成多个表。我看不出它给您带来了什么好处(考虑到上一节),它会让您的管理生活变成一场噩梦(想象一下,改变所有表的吞吐量,或者备份它们,或者创建一个CloudFormation模板来创建整个环境)

我关心的是,当您提取历史记录时,将返回多少条消息。我想您将通过
query
命令实现这一点,其中
ConversationID
作为散列键,并通过
CreationDate
降序对结果进行排序。在这种情况下,我只返回结果的第一页(我认为它最多返回1MB的数据,因此取决于平均消息长度,这可能足够或不够),并且只有在用户不断滚动的情况下,才能获取下一页。否则,您可能会在非常长的对话中使用大量吞吐量,而且无论如何,客户机不想长时间等待兆字节的数据出现在屏幕上

希望这有帮助