【问题标题】:DynamoDB List data-type issueDynamoDB 列表数据类型问题
【发布时间】:2018-07-26 07:46:45
【问题描述】:

根据doc,DynamoDB 支持 map (M) 和 list (L) 类型,但是当我尝试创建 (L) 类型的表时,我收到错误:

ValidationException(客户端):检测到 1 个验证错误:“attributeDefinitions.2.member.attributeType”处的值“L”未能满足约束:成员必须满足枚举值集:[B,N,S]

ThreadReplyIds 属性添加到表信息后发生:

[
    'AttributeDefinitions' => [
        [
            'AttributeName' => 'UserId',
            'AttributeType' => 'N',
        ],
        [
            'AttributeName' => 'ThreadReplyIds', // <<---
            'AttributeType' => 'L',
        ],
        [
            'AttributeName' => 'Title',
            'AttributeType' => 'S',
        ],
    ],
    'KeySchema' => [
        [
            'AttributeName' => 'UserId',
            'KeyType' => 'HASH',
        ],
        [
            'AttributeName' => 'Title',
            'KeyType' => 'RANGE',
        ],
    ],
    'ProvisionedThroughput' => [
        'ReadCapacityUnits' => 5,
        'WriteCapacityUnits' => 5,
    ],
    'TableName' => 'Thread',
]

我的目标是为ThreadReplyIds 存储一个列表或一组整数值。 我做错了什么?

【问题讨论】:

    标签: amazon-web-services amazon-dynamodb aws-php-sdk


    【解决方案1】:

    起初,我认为这可能是您使用的 SDK 版本。但是在阅读了一些文档之后,似乎在创建表时,任何 AttributeDefinition 的 AttributeType 只能是“S|N|B”之一(意思是“字符串”、“数字”或“二进制”)。参考:PHP SDK DynamoDB AttributeDefinition

    这是有道理的,因为无论如何您都不能在 KeySchema 中使用 List。因此,在创建表时没有必要为您的列表定义属性。在创建表后在表中放置或更新项目时,您始终可以将此属性添加到您想要的任何数据中。见这里:PHP SDK DynamoDB PutItem

    【讨论】:

    • 这正是我的想法。无论如何,我们不能预先定义这样的属性看起来很混乱
    • 嗯,它是一个非关系型存储系统,因此任何一项都可能与下一项完全不同(除了键)。 SDK 在创建表时只需要有关哪些属性用于键的信息。
    • 您可以在任何顶级 JSON 元素上创建全局二级索引或本地二级索引
    • 我仍然不确定如何在类型列表的键上添加全局二级索引?这意味着只能在属于 [S,N,B] 类型之一的键上创建索引。如果我们想对一个项目中的项目列表进行排序怎么办?例如,用户拥有的商店?那么我必须维护什么样的 GSI?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2013-01-29
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    相关资源
    最近更新 更多