2016-04-27 38 views
1

我在DynamoDB中有Messages表。它有四列发件人,时间戳,邮件,收件人。我想知道不是使用四列中的任何一列创建分区键,为什么不创建另一个列用于分区目的连接发件人&时间戳&收件人。DynamoDB中分区键的优化

因此,这列将保存数据,如JohnSmithID1461754484307SallyMcDonaldID。

通过这样做,当搜索来自特定发件人&收件人组合的邮件时,我可以通过使用此列使用查询来查询(如以&结尾)。还有其他一些利用这一栏的方法。

问题1.我被过度试图使用一列,而不是散布我查询到的几个列在这里事情复杂?

问题2.采取这个方向是否有明显的性能好处?如果我消除列SenderId & RecipientID数据大小的目的

问题3:这是设计模式不仅值得吗? (我需要时间戳排序键列)

回答

4

我认为你必须再次how DynamoDB partition keys work阅读。您无法在分区键上执行“开头”或“结束”等查询,因为您必须为查询提供完整的分区键。您只能在排序键上提供这样的条件(但请注意,函数有begins_with函数,但是没有ends_with函数)。

您的想法可能基于使用扫描而不是查询,但(关于问题2),这会导致更多的使用容量和性能不佳,因为DynamoDB必须查看表中的每个项目。如果你想有更多的查询灵活性,你可以定义一个或多个secondary indexes

你可以自己回答问题3:DynamoDB量是相当昂贵的,但我们谈论的是每个条目也许20字节的差异。如果您最终可能会在表中输入> 10.000.000个条目,则可能会成为问题,否则请忽略它。

1

您的特定示例将不起作用,因为查询时您无法在分区键上具有条件。您只能在Sort Key上有这样的条件。

虽然这种结构有时可能派上用场。例如,如果您有三个要查询的属性。 DynamoDB允许最多两个(分区键+排序键),因此在这种情况下,其中一个可以是两个或更多属性的组合。

+0

先生,是ü说,如果我想用三个滤波器参数,我不会因为有dynamodb表做查询,尽管有摆在所有三个各自列二级指标? – shle2821

+0

@ shle2821我在谈论一个场景,当你需要查询一个可以由三个或更多属性组合定义的项目时。 DynamoDB允许使用最多两个属性(分区键+排序键)形成主键。更多信息[here](http://stackoverflow.com/questions/32620215/3-fields-composite-primary-key-unique-item-in-dynamodb) –

+0

感谢您的信息。那么,让我问你一下。单独留下主键时,我会根据senderID&timestamp&recipientID创建一个排序键?因此,用户的设备将三个属性连接在一起并发送到DynamoDB。由于它是一个排序键,我可以用“begin with”,“end with”等来查询。您对这种设计模式有什么看法? – shle2821