我是 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
如果我预先知道所有项目都始终存在此类属性,这样做会更好吗?或者是最好是极简主义,只定义一个主键,而不定义其他任何东西,以实现完全的灵活性? (但如果这始终是最佳实践,为什么表定义允许您这样做?)
从来没有。没有选项可以将非键属性定义为表定义的一部分。
尽管其名称听起来很通用,但
AttributeDefinitions
仅适用于分区和排序键字段*。它是“描述表和索引的关键架构的属性数组”。仅允许 3 种符合密钥条件的数据类型(字符串、数字、二进制)作为 AttributeType
。如果定义了二级索引,则可以在多个 AttributeName
中引用一个 KeySchema
。KeySchema
指定构成表或索引主键的属性。 KeySchema 中的属性也必须在 AttributeDefinitions 数组中定义。 *