试图以最佳方式设计架构或表并查找键

时间:2019-02-14 18:01:53

标签: amazon-dynamodb

我正在尝试设计dynamodb模式/表,并尝试根据用例和查询模式找到PK / SK,LSI,GSI。

我是DynamoDB的新手,尝试了几种表模式,但我混合了很多东西。

我的用例如下,有一个问题或挑战板,用户可以在一个管理员下玩。可能有许多这样的管理员,并且特定管理员下的用户。那么每个用户将被标记为多个挑战。例如

admin_id --- 1对多-> users_id --1对1-> challenges_id

挑战可以分类如下

  • 非常容易
  • 轻松
  • 适中
  • 有些困难
  • 非常辛苦

现在用户可以对

等挑战采取一些措施
  • 已解决
  • 待处理
  • 进行中
  • yet_to_start
  • will_start_tomorrow
  • Not_Application等。

现在我想出了下表和json格式。

{     “ TableName”:“挑战”,

 "Item": {
    "challenges_id":        { "123456" },
    "user_id":              { "123456" },
    "admin_id":             { "123456" },
    "challenges_type":      { "Very easy", "Easy", "Moderate", "Somewhat hard", "Hard", "Very Hard" },
    "challengesDesc":       { "Some desc" },

    "ActionCd":             {"solved", "Pending", "InProgress", "yet_to_start", "will_start_tomorrow", "Not_Application"},


 }

}

我认为Challenge_id可能是PK。 基本查询模式如下。

  • 获取为特定管理员标记给每个用户的所有挑战
  • 按操作类型获取特定用户订单的所有挑战
  • 获取特定管理员对每个用户的所有挑战的计数

如果需要提供更多详细信息,请告诉我。

1 个答案:

答案 0 :(得分:1)

您可以使用以下内容作为您的模式

| pk      |   sk                      | status    | user    | challenges_type      | 
| admin1  |  users#user1#Very easy    | solved    | user1   |  admin1#solved       | ... some more metadata
| admin1  |  users#user1#Moderate     | InProgress|         |  admin1#InProgress   | ... some more metadata
| admin2  |  users#user3#Very easy    | solved    |         |  admin2#solved       | ... some more metadata

GSI1 pk:用户sk:challenges_type

用例

  1. 获取为特定管理员标记给每个用户的所有挑战

    Select * where pk=admin1

    获取所有结果并计算

  2. 按操作类型获取特定用户订单的所有挑战

    Select * from GSI1 where pk=user1

  3. 获取特定管理员每个用户的所有挑战计数

    Select * from GSI1 where pk=user1 and sk beginswith admin1

这将为您提供有关如何构建dynamodb模式的基本思想。