【问题标题】:Generate synthetic partition keys for a DynamoDB table为 DynamoDB 表生成合成分区键
【发布时间】:2019-03-02 05:34:57
【问题描述】:

我确信这是一个关于 DynamoDB 的微不足道且常见的问题,但 Google 或 AWS 文档并没有太大帮助。

我的问题很简单:

生成分区键的模式是什么?

在 RDBMS 中,这非常简单,例如带有标识列 (MSSQL) 或序列 (Postgres)。但是,当涉及到 DynamoDB(我想这适用于任何 NoSQL 数据库)时,不清楚如何生成分区键 - 它应该是一个 GUID 还是一个在表本身中维护的序列?

这是来自AWS docs 的示例架构 - 它使用递增数字作为分区键。但是我想不出一种方法可以在应用程序级别生成不重叠的序列号(而不是在提供 DynamoDB 不提供的原子事务的数据库级别)

【问题讨论】:

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


    【解决方案1】:

    总的来说,您的问题是如何在 DynamoDB 等空间中生成序列号(如 Oracle 序列)。我遇到了类似的挑战,下面是我发现使用 AWS 无服务器方法的更好方法...

    1.在 DynamoDB 中设置序列号表

    创建一个简单的表,例如具有分区键 (id) 和序列号属性 (sequence_number) 的 order-number-sequence。

    {“id”: “100”,“sequence_number”: 250000}
    

    我将 id 设置为字符串类型,值为“100”。这可以设置为分区键字段的数字或任何允许的类型。 sequence_number 是一个数字属性,将充当原子序数,在此示例中,我将 250000 设置为其初始值。

    2。创建 API

    使用 POST 方法创建一个非常小的 API,调用该方法时将返回上表中的下一个序列号。 使用 API Gateway 的 DynamoDB 内置集成。 配置 DynamoDB 与 API Gateway 的集成以及对 DynamoDB 执行 UpdateItem 操作需要设置

    3.配置请求映射模板

    为内容类型 application/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 的 UpdateItem 返回的响应中获取 sequence_number 及其值。

    {“sequence_number”: “$input.path(‘$.Attributes.sequence_number.N’)”}
    

    通过上述设置,如果我们现在测试 API,我们应该会看到如下响应:

    {“sequence_number”: “250006”}
    

    我希望上述方法对您有所帮助...

    【讨论】:

      【解决方案2】:

      几乎可以肯定,您希望分区键是您知道是唯一的东西,而无需参考现有数据,因为它的唯一性已在您的业务逻辑中假设(例如产品的序列号或电子邮件地址)一个用户)或因为它是普遍唯一的(最简单的方式是作为 GUID、时间戳或其他一些一次性属性)。

      大规模生成顺序唯一标识符实际上很难实现,而且大多数 RDBMS 实现实际上并不像您预期​​的那样严格(它们通常不保证不会跳过数字,例如,仅它们将是唯一的并且单调递增)。如果您认为需要在表中使用递增的 id,请仔细考虑为什么以及是否可以避免这样做。

      如果您确实确实需要一个递增的数字分区键,那么您需要在您的应用程序中有一个服务来为您生成它。您可以将其实现为一个单独的 dynamodb 表,其中仅包含一行,并带有一个“计数器值”字段,您可以使用 ADD update expression 递增该字段。扩展这个实现会有问题。

      【讨论】:

        猜你喜欢
        • 2014-05-19
        • 1970-01-01
        • 1970-01-01
        • 2019-02-02
        • 1970-01-01
        • 2016-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多