非主键属性是否应该成为 DynamoDB 表定义的一部分?

问题描述 投票:0回答:1

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

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

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

上面仅定义了一个

Id
列,没有其他属性 - 但在代码中,添加新项目时始终使用其他属性(名为
Type
Payload
的字符串)。

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

AttributeDefinitions
部分:

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

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

database-design nosql amazon-dynamodb
1个回答
3
投票

从来没有。没有选项可以将非键属性定义为表定义的一部分。

尽管其名称听起来很通用,但

AttributeDefinitions
仅适用于分区和排序键字段*。它是“描述表和索引的关键架构的属性数组”。仅允许 3 种符合密钥条件的数据类型(字符串、数字、二进制)作为 AttributeType。如果定义了二级索引,则可以在多个
AttributeName
中引用一个
KeySchema

KeySchema

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

*
docs

唯一标识 Amazon DynamoDB 表中每个项目的主键可以是简单的(仅分区键)或复合的(分区键与排序键组合)。

© www.soinside.com 2019 - 2024. All rights reserved.