您的数据建模过程必须考虑您的数据检索需求,在 DynamoDB 中您只能通过哈希或哈希 + 范围键进行查询。
如果通过主键查询不足以满足您的要求,您当然可以通过创建二级索引(本地或全局)来拥有备用键。
但是,在某些情况下可以使用多个属性的串联作为主键,以避免维护二级索引的成本。
如果您需要按名字、姓氏和创建日期获取用户,我建议您将这些属性包含在哈希和范围键中,这样就不需要创建额外的索引。
哈希键应包含一个可由应用程序计算的值,同时提供统一的数据访问。例如,假设您选择按如下方式定义键:
哈希键(名称):名字#姓氏
范围键(已创建):MM-DD-YYYY-HH-mm-SS-毫秒
如果提到的属性不足以使您的密钥在表中唯一,您可以随时附加其他属性。
users = Table.create('users', schema=[
HashKey('name'),
RangeKey('created'),
], throughput={
'read': 5,
'write': 15,
})
将用户添加到表中:
with users.batch_write() as batch:
batch.put_item(data={
'name': 'John#Doe',
'first_name': 'John',
'last_name': 'Doe',
'created': '03-21-2015-03-03-02-3243',
})
用于查找创建于“03-21-2015”的用户 John Doe 的代码应类似于:
name_john_doe = users.query_2(
name__eq='John#Doe',
created__beginswith='03-21-2015'
)
for user in name_john_doe:
print user['first_name']
重要考虑因素:
我。如果您的查询开始变得过于复杂,并且由于具有太多连接字段而导致哈希或范围键太长,那么一定要使用二级索引。这是一个好兆头,表明仅主索引不足以满足您的要求。
二.我提到哈希键应该提供统一数据访问:
“Dynamo 使用一致的散列来跨其密钥空间进行分区
副本并确保均匀的负载分布。统一密钥
分布可以帮助我们实现均匀的负载分布假设
密钥的访问分配并没有高度倾斜。”[DYN]
Hash Key不仅可以唯一标识记录,而且是确保负载分配的机制。范围键(使用时)有助于指示主要一起检索的记录,因此,也可以针对这种需要优化存储。
下面的链接有关于该主题的完整解释:
http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForTables.html#GuidelinesForTables.UniformWorkload