对象的DynamoDB表结构

时间:2014-04-18 15:37:53

标签: amazon-dynamodb

民间,   你会建议DynamoDB表结构用于以下对象?将有大约200万个对象,需要通过电子邮件和/或组织进行搜索。

{
  email: 'foo@bar.com',
  organization: 'foobar'
}

你会为哈希/范围键做什么?我需要能够执行以下操作:

  • 检索特定organization
  • 的所有电子邮件
  • 删除特定的email

我应该在表中添加一个随机id参数吗?我想以下是正确的方法:

  • organization是哈希密钥,email是范围密钥。

由于

3 个答案:

答案 0 :(得分:1)

似乎其中任何一个都会将您的对象作为哈希键分发,因此我不知道它们中的任何一个本身都是更好的哈希键。我认为您需要检索organization的所有特定电子邮件这一事实使得它更适合使用哈希密钥。您可以使用该组织进行查询以获取组织的所有电子邮件。

请注意,为了支持您描述的用例,您需要一个全局二级索引。 This answer可能有助于说明原因,但假设您使用Organization作为表哈希键,则需要email上的全局二级索引来检索特定的电子邮件(或检索该项目以删除它)。

答案 1 :(得分:0)

问题是预配置容量和扫描操作。如果你有100万条记录,每条85字节,相当于86000 KB,这需要21,000个预配读取!

此时,为了降低成本,我认为除了拥有以下结构之外别无选择:

| Hash Key | Range Key    | Secondary Range Key |
| 1        | organization | email               |
换句话说,

| Hash Key | Range Key    | Secondary Range Key |
| 1        | foo          | asdf@foo.com        |
| 1        | bar          | asdf@bar.com        |
| 1        | foo          | fdsa@foo.com        |

这意味着您始终了解您的HashKey。使用它,您可以对特定的RangeKeys进行查询。

思想?

答案 2 :(得分:0)

C在您的基表中使用电子邮件作为主题密钥,因为它比部门更随机,因此它可以很好地进行分区。

使用Organization作为hashkey创建GSI。

1)检索特定组织的所有电子邮件

使用hashkey等于目标组织查询您的GSI。

2)删除特定的电子邮件

很容易完成,因为电子邮件是基表的哈希键。

低配置吞吐量仍然有效。唯一的影响是您的扫描需要更长的时间。如果您的Read Provisioned吞吐量读数为10,那么您的扫描将采用:

21000/10 = 2100秒。

我认为对于扫描操作,您可以设置应该返回多少项的限制。结果还将包含lastEvaluatedKey,您可以在扫描调用中为下一页提供该内容。