【问题标题】:Dynamodb: query using more than two attributesDynamodb:使用两个以上属性进行查询
【发布时间】:2015-03-21 20:52:55
【问题描述】:

在 Dynamodb 中,您需要在索引中指定可用于进行查询的属性。

如何使用两个以上的属性进行查询?

使用 boto 的示例。

Table.create('users', 
        schema=[
            HashKey('id') # defaults to STRING data_type
        ], throughput={
            'read': 5,
            'write': 15,
        }, global_indexes=[
            GlobalAllIndex('FirstnameTimeIndex', parts=[
                HashKey('first_name'),
                RangeKey('creation_date', data_type=NUMBER),
            ],
            throughput={
                'read': 1,
                'write': 1,
            }),
            GlobalAllIndex('LastnameTimeIndex', parts=[
                HashKey('last_name'),
                RangeKey('creation_date', data_type=NUMBER),
            ],
            throughput={
                'read': 1,
                'write': 1,
            })
        ],
        connection=conn)

如何使用 boto 查找名字为“John”、姓氏为“Doe”并在“2015 年 3 月 21 日”创建的用户?

【问题讨论】:

  • 您在索引上查询,可以使用ConditionExpression 进行其他属性比较。我不清楚您的表格现在是如何构成的。
  • 您还需要哪些额外信息?你的意思是建表命令不够?

标签: python amazon-web-services amazon-dynamodb boto nosql


【解决方案1】:

您的数据建模过程必须考虑您的数据检索要求,在 DynamoDB 中您只能通过哈希或哈希 + 范围键进行查询。

如果按主键查询不足以满足您的要求,您当然可以通过创建二级索引(本地或全局)来获得备用键。

但是,在某些情况下,可以将多个属性的串联用作您的主键,以避免维护二级索引的成本。

如果您需要通过名字、姓氏和创建日期来获取用户,我建议您将这些属性包含在 Hash 和 Range Key 中,这样就不需要创建额外的索引。

哈希键应该包含一个可以由您的应用程序计算的值,同时提供统一的数据访问。例如,假设您选择如下定义密钥:

哈希键(名称):first_name#last_name

范围键(已创建):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',
     })

您在“2015 年 3 月 21 日”创建的用于查找用户 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 不仅可以唯一标识记录,而且是保证负载分布的机制。 Range Key(使用时)有助于指示将大部分一起检索的记录,因此,也可以针对这种需要优化存储。

下面的链接对这个话题有完整的解释:

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForTables.html#GuidelinesForTables.UniformWorkload

【讨论】:

    猜你喜欢
    • 2021-12-27
    • 1970-01-01
    • 2018-09-20
    • 2022-01-22
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 2022-09-30
    • 1970-01-01
    相关资源
    最近更新 更多