python - 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。这种方法常见吗?
解决方案
首先,使用排序键按时间顺序对数据进行排序是否正确
排序键是在DynamoDB 中对数据进行排序的方法。使用时间戳作为排序键字段是正确的做法,也是 DDB 中的常见模式。
DynamoDB 需要提供排序键……因为主键由分区键和排序键组成。
这是真实的。但是,当从 DDB 读取时,可以使用查询操作仅指定分区键(与需要完整主键的操作相反)。这是一个强大的构造,可让您指定要从给定分区中读取的项目。get_item
您可能需要查看 KSUID 以获取您的唯一标识符。KSUID 类似于 UUID,但它们包含时间组件。这允许它们按生成时间排序。python中有几个KSUID库,不需要自己实现算法。
推荐阅读
- java - 从工具 API 开始调试自定义 Gradle 插件
- acumatica - Acumatica 自定义 DAC 未触发业务事件
- postgresql - “SELECT”处或附近的 PostgreSQL 语法错误
- trace32 - 命令 DIAG 3411 有什么作用?
- c - 可变参数函数仿真方法的优缺点
- jointjs - 创建新模型时在 Angular 中使用 Jointjs 创建默认链接 new joint.shapes.devs.Model
- javascript - 将带有图块表格的现有商业网页转换为更友好的表格或列表?
- clang - 使用 LLVM DataFlow Sanitizer 包装函数
- java - io.dropwizard.testing.junit5.DropwizardExtensionsSupport.beforeEach 处的 java.lang.NullPointerException
- identityserver4 - .NET 框架上的 OIDC 身份验证的意外行为