我有一个这样的消息表:
From | To | timestamp | Message
------|-------|-------------------------|------------------
john | Mark | 2014-04-28T07:53:29.000Z|"Some message1"
john | Mark | 2014-04-28T08:53:29.000Z|"Some message2"
john | Mary | 2014-04-28T09:53:29.000Z|"Some message3"
mary | Kevin | 2014-04-28T07:53:29.000Z|"Some message4"
jane | John | 2014-04-28T07:53:29.000Z|"Some message5"
我需要能够选择按日期(最新的第一个)排序的所有消息 FROM [用户],这将导致分页(一次10条消息)。
我还需要能够选择按日期(最新的第一个)再次排序的 TO [用户]发送的所有消息,这将导致分页(一次10条消息)。
我的第一个想法是创建两个表:
FROM table (FROM = PK,Timestamp = Range)和 TO表(TO = PK,Timestamp = Range)。
创建消息时,需要将其发送到FROM和TO表(重复数据)。然后我可以查询FROM表是否需要从用户获取消息,并且当我需要将消息发送给用户时可以查询TO表。
我的第二个想法是使用全局二级索引。据我所知,全球二级指数没有限制。有了这个,我会让表有一个PK = FROM和RANGE =时间戳。然后,我将创建一个全局二级索引PK = TO和RANGE = Timestamp。我能做到的唯一好处就是我不会有重复的数据。如果我使用全局二级索引而不是在性能,限制或其他方面对表进行规范化,是否存在任何缺点或“监视”?
答案 0 :(得分:1)
对于您的用例,全局二级索引是非常自然的选择。在节省复制数据的时间时,成本将保持不变。
很快 - 不,没有具体的性能或限制问题。全局二级索引的行为就像它们是单独的表一样,例如它们有自己的读/写吞吐量。
查看此文档了解详细信息: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html#GSI.Writes