首页 > 解决方案 > DynamoDB 复合主键在系统内传播的最佳实践(分区键和排序键)

问题描述

我正在开发一个系统,我将数据存储在 DynamoDB 中,并且必须按时间顺序排序。因为partition_key我有一个id(uuid) 并且sort_key我有一个date_created值。现在最初只使用 ID 来保存唯一条目就足够了,但后来出现了一个问题,即这些数据没有按我的意愿排序,所以添加了一个 sort_key。

使用 python boto3 库,我只使用 id 主键来获取、更新或删除项目就足够了,因为我知道它总是唯一的:

import boto3

resource = boto3.resource('dynamodb')
table = resource.Table('my_table_name')

table.get_item(
    Key={'item_id': 'unique_item_id'}
)
table.update_item(
    Key={'item_id': 'unique_item_id'}
)
table.delete_item(
    Key={'item_id': 'unique_item_id'}
)

但是,DynamoDB 也需要提供排序键,因为主键由分区键和排序键组成。

table.get_item(
    Key={
        'item_id': 'unique_item_id',
        'date_created': 12345          # timestamp
    }
)

首先,使用排序键按时间顺序对数据进行排序是正确的方法还是有更好的方法?

其次,在整个系统中传输分区键和排序键的最佳方法是什么?例如,我有一个接受 ID 的 API 端点,后端通过这个 ID 执行get_item查询并返回相应的数据。现在因为我还需要排序键,所以我正在考虑在内部使用散列算法,我会像这样散列 JSON:

{
    "item_id": "unique_item_id",
    "date_created": 12345
}

然后一个值成为我这个数据库条目的标识符。然后,我会在执行任何数据库查询之前对这个值进行 dehash。这种方法常见吗?

标签: pythonamazon-web-servicessortingamazon-dynamodbboto3

解决方案


首先,使用排序键按时间顺序对数据进行排序是否正确

排序键是DynamoDB 中对数据进行排序的方法。使用时间戳作为排序键字段是正确的做法,也是 DDB 中的常见模式。

DynamoDB 需要提供排序键……因为主键由分区键和排序键组成。

这是真实的。但是,当从 DDB 读取时,可以使用查询操作指定分区键(与需要完整主键的操作相反)。这是一个强大的构造,可让您指定要从给定分区中读取的项目。get_item

您可能需要查看 KSUID 以获取您的唯一标识符。KSUID 类似于 UUID,但它们包含时间组件。这允许它们按生成时间排序。python中有几个KSUID库,不需要自己实现算法。


推荐阅读