DynamoDB table 定义中应何时包含主键以外的属性?

When should attributes other than a primary key be included in a DynamoDB table definition?

我是 DynamoDB(以及一般的 NoSQL 数据库)的新手,所以这是一个非常基本的问题。

我正在使用现有代码,其中 DynamoDB table 是通过 CloudFormation 使用 YAML 创建的,类似于以下内容:

MyDynamoDBTable:
  Type: AWS::DynamoDB::Table
  Properties:
    TableName: MyDynamoDBTable
    AttributeDefinitions:
      - AttributeName: Id
        AttributeType: S
    KeySchema:
      - AttributeName: Id
        KeyType: HASH
    ProvisionedThroughput:
      ReadCapacityUnits: 5
      WriteCapacityUnits: 5

上面只定义了一个 Id 列,没有其他属性 - 但是在代码中,添加新属性时总是使用其他属性(名为 TypePayload 的字符串)项目。

我以前只使用关系数据库,所以这种添加不在模式中的属性的范例感觉有点陌生。我的问题是在 table 定义中包含不属于主键的其他属性是否合适?例如。将以下属性添加到 AttributeDefinitions 部分:

      - AttributeName: Type
        AttributeType: S
      - AttributeName: Payload
        AttributeType: S

如果我预先知道这些属性将始终存在于所有项目中,这样做会更好吗?或者最好是极简主义,只定义一个主键而不定义其他任何东西以实现完全的灵活性? (但如果这始终是最佳实践,为什么 table 定义允许您不这样做?)

从来没有。没有选项可以将非键属性定义为 table definition.

的一部分

尽管其名称听起来很普通,但 AttributeDefinitions 仅适用于分区和排序键字段*。它是 “描述 table 和索引的键模式的属性数组”。仅允许 3 种符合键条件的数据类型(字符串、数字、二进制)作为 AttributeType。如果定义了二级索引,一个AttributeName可以被多个KeySchema引用。

KeySchema 指定构成 table 或索引的主键的属性。 KeySchema 中的属性也必须定义在 AttributeDefinitions 数组.


* docs: 唯一标识 Amazon DynamoDB 中每个项目的主键 table 可以是简单的(仅分区键)或复合的(分区键组合使用排序键)。