民间, 你会建议DynamoDB表结构用于以下对象?将有大约200万个对象,需要通过电子邮件和/或组织进行搜索。
{
email: 'foo@bar.com',
organization: 'foobar'
}
你会为哈希/范围键做什么?我需要能够执行以下操作:
organization
email
我应该在表中添加一个随机id参数吗?我想以下是正确的方法:
organization
是哈希密钥,email
是范围密钥。由于
答案 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,您可以在扫描调用中为下一页提供该内容。