我相信对于DynamoDB来说,这是一个琐碎而常见的问题,但是Google或AWS文档并没有多大帮助。
我的问题很简单:
生成分区键的模式是什么?
在RDBMS中,这非常简单,例如,使用标识列(MSSQL)或序列(Postgres)。但是,当涉及到DynamoDB (我猜这适用于任何NoSQL数据库)时,还不清楚如何生成分区键--是GUID还是表中维护的序列?
下面是来自AWS博士的一个示例模式--它使用递增数字作为分区键。但我想不出在应用程序级别生成非覆盖序列号的方法(与提供原子事务的数据库级别相反,DynamoDB不提供原子事务)。
发布于 2018-09-26 13:31:27
几乎可以肯定,您希望分区键是唯一的,而不需要引用现有的数据,因为它的唯一性在您的业务逻辑中被假定为(比如产品的序列号或用户的电子邮件地址),或者因为它是普遍唯一的(最简单的方法是充当GUID、时间戳或其他一些只使用一次的属性)。
生成顺序唯一标识符实际上很难在规模上完成,而且大多数RDBMS实现实际上并不像您可能期望的那样严格(例如,它们通常不能保证数字不会被跳过,只是它们将是唯一的和单调增加的)。如果您认为需要在表中使用递增的id,请仔细考虑为什么和是否可以避免这样做。
如果您确实需要一个递增的数字分区键,则需要在您的应用程序中有一个为您生成它的服务。您可以将其实现为一个单独的dynamodb表,该表只包含一行,其中包含一个“计数器值”字段,使用添加更新表达式进行增量。扩展这个实现是有问题的。
发布于 2022-01-12 03:54:50
总的来说,您的问题是如何在像DynamoDB这样的空间中生成序列号(如)。我遇到了类似的挑战,下面是更好的方法,我发现使用AWS无服务器方法.
1.在DynamoDB中设置序列号表
创建一个简单的表,例如具有分区键(id)和序列号属性(sequence_number)的订单编号序列。
{“id”: “100”,“sequence_number”: 250000}我将id设置为字符串类型,其值为“100”。可以将此设置为分区键字段的数字或任何允许的类型。sequence_number是一个数字属性,它将充当原子序数,在本例中,我将250000设置为它的初始值。
2.创建API
使用POST方法创建一个非常小的API,该方法在调用时将从上面的表返回下一个序列号。为DynamoDB使用API的内置集成。配置与API网关的DynamoDB集成以及在DynamoDB上执行UpdateItem操作需要设置
3.配置请求映射模板
为内容类型应用程序/json创建一个新的映射模板。这是这个设置中最重要的部分。我们不需要为此编写任何复杂的脚本,因此希望它应该足够简单,以便于理解。此模板包含UpdateItem操作的参数和有效载荷( DynamoDB集成时需要安装API )
{ “TableName”: “order-sequence-number”,
“Key”: { “id”: { “S”: “100” } },
“ExpressionAttributeValues”: { “:val”: { “N”: “1” } }, “UpdateExpression”: “SET sequence_number = sequence_number + :val”, “ReturnValues”: “UPDATED_NEW”}4.测试API
我们只需要从从DynamoDB的sequence_number返回的响应中获取sequence_number及其值。
{“sequence_number”: “$input.path(‘$.Attributes.sequence_number.N’)”}使用上面的设置,如果我们现在测试API,我们应该看到下面的响应:
{“sequence_number”: “250006”}我希望上面的方法有帮助..。
https://stackoverflow.com/questions/52517743
复制相似问题