0

对我来说,“散列”这个词表明,在 DynamoDB 中散列由多个字段组成是可能的。但是,我发现的每一篇文章都显示了只包含一个值的“哈希”……这对我来说没有任何意义。

我的表由以下字段组成:

  • 用户界面 (PK)
  • 提供者
  • 标识符
  • 接收日期
  • 处理日期

目标是根据我的应用程序检索数据的方式(当然,PK 除外)建立多个索引。组合是:

  1. 通过提供者的消息标识符:
    所需哈希:提供者 + 标识符

  2. 通过会话消息标识符:
    所需哈希:从 + 到

  3. 到收到的日期以及是否已处理
    所需的哈希:_ac

  4. 到收到的日期以及是否已处理
    所需的哈希:帐户

这是我尝试过但未成功的示例之一...

  MessagesTable:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: messages
      BillingMode: PAY_PER_REQUEST
      AttributeDefinitions:
        - AttributeName: uid
          AttributeType: S
        - AttributeName: account
          AttributeType: S
        - AttributeName: provider
          AttributeType: S
        - AttributeName: identifier
          AttributeType: S
        - AttributeName: from
          AttributeType: N
        - AttributeName: to
          AttributeType: N
        - AttributeName: _ac
          AttributeType: N
        - AttributeName: _ap
          AttributeType: N
      KeySchema:
        - AttributeName: uid
          KeyType: HASH
      GlobalSecondaryIndexes:
        - IndexName: idxConversation
          KeySchema:
            - AttributeName: from:to
              KeyType: HASH
            - AttributeName: _ac
              KeyType: RANGE
          Projection:
            ProjectionType: KEYS_ONLY
        - IndexName: idxProviderMessage
            KeySchema:
              - AttributeName: provider:identifier
                KeyType: HASH
              - AttributeName: _ac
                KeyType: RANGE
            Projection:
              ProjectionType: KEYS_ONLY
4

1 回答 1

2

这不是 DDB 的工作方式......

from: "sender@myco.com"
to: "recevier@otherco.com"

你想在记录中有另一个属性

gsiHash: "sender@my.com#recevier@otherco.com"

这就是您指定为 GSI 哈希键的属性。

请注意,为了通过此 GSI 访问数据,您需要知道 from 和 to。

在您的情况下,您可能想从DDB 文档的Overloading Global Secondary Indexes页面中获取提示

您可以将多条记录写入表中,而不是写入一条记录

s: id, keytype: hash  
s: data, keytype: sort  
s: gsi-sk  

记录看起来像

id:"<uid>",data:"PRIMARY", gsi-sk:"<?>" //"primary" record  
id:"<uid>",data:"FROM", gsi-sk:"sender@myco.com"
id:"<uid>",data:"TO", gsi-sk:"receiever@otherco.com"
id:"<uid>",data:"FROMTO", gsi-sk:"sender@myco.com#receiever@otherco.com"
id:"<uid>",data:"PROVIDER", gsi-sk:"whateverid"
<ect>

现在,您创建一个 GSI,data并将其作为散列键和gsi-sk排序键。

扩展我的评论
或者,您可以扩展您放入“数据”的内容

id:"<uid>",data:"PRIMARY", gsi-sk:"<?>" //"primary" record  
id:"<uid>",data:"FROM#sender@myco.com", gsi-sk:"TO#receiever@otherco.com"
id:"<uid>",data:"TO#receiever@otherco.com", gsi-sk:"FROM#sender@myco.com"
id:"<uid>",data:"PROVIDER#<whateverid>", gsi-sk:"IDENTIFIER#<someid>"
<ect>

您在主记录中保留多少数据取决于您的访问要求。您是否希望能够得到所有带有 aGetItem(hk=<uid>, sk="PRIMIARY")或的东西是Query(hk=<uid>)可接受的

于 2020-10-22T16:35:50.120 回答