我有一个这样的消息表:
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 [user]按日期(最新的第一个)排序,这将导致分页(一次10条消息)。
我还需要能够选择发送的所有消息到[用户]再次按日期(最新的第一个)排序,这将导致分页(一次10条消息)。
我首先想到的是创建两个表:
FROM table (FROM = PK, Timestamp = Range)和TO table (TO= PK, Timestamp = Range).
创建消息时,它需要同时发送到FROM和to表(数据复制)。然后,如果我需要从用户获取消息,我可以查询FROM表,当我需要获取发送给用户的消息时,我可以查询to表。
我的第二个想法是使用全局二级索引。据我所知,对全局二级索引没有限制。这样,我就可以让表具有PK = FROM和RANGE = Timestamp。然后,我将创建一个全局二级索引PK = TO和RANGE = Timestamp。这样做的唯一好处是我不会有重复的数据。如果我要使用全局二级索引,而不是在性能、限制或其他方面对表进行规范化,那么有什么缺点或"注意事项"吗?
对于您的用例,全局二级索引是非常自然的选择。成本将保持不变,而您节省了复制数据的时间。
简短地说——没有,没有具体的性能或限制问题。全局二级索引的行为就像它们是独立的表一样,例如,它们有自己的读/写吞吐量。
查看此文档以获取详细信息:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html GSI.Writes