DynamoDB多对多等效

时间:2019-06-11 20:00:53

标签: amazon-web-services amazon-dynamodb

我想在DynamoDB中复制以下关系

  

用户可以拥有许多奖牌

     

奖章可以授予许多用户

我读到您应该只在DynamoDB中使用一个表,但是我还没有想到解决该问题的方法。

我首先想到的是创建一个奖牌表,然后在用户表中让用户获得奖牌ID列表。

这需要对数据库的更多请求,但听起来还是不好。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

在DynamoDB中查看adjacency list pattern for many to many relationships。那应该帮你。还可以查看Rick Houlihan在2017和2018 reInvent上的高级数据建模讲座。

答案 1 :(得分:0)

关系数据库

对于常规Relational Database设置的简单用例,可以通过以下方式实现:

Users

ID  | Name
----+---------------
U01 | John
----+---------------
U02 | Richard


Medals

ID  | Name        | Points
----+-------------+--------
M01 | Gold        | 500
----+-------------+--------
M02 | Sliver      | 200


Users_Medals

User ID  | Medal ID | Attainment
---------+----------+-------------
U01      | M01      | Apr 2, 2019
---------+----------+-------------
U01      | M02      | Jun 3, 2019
---------+----------+-------------
U02      | M02      | Jun 2, 2019

DynamoDB

然而,对于DynamoDB,目标是通过Hash Key(认为它是主键)来整理数据以便快速检索(单个数字毫秒),在表之间严格没有联接在DynamoDB中

数据略有重复(即为每个用户复制了勋章名称),这很可能会在updatedelete期间受到重罚(例如,如果勋章名称需要从“金”更改为改为“白金”,则需要对所有记录进行扫描并分别进行更新

<!-- Hash and Range Key -->

Users_Medals

User ID (HashKey)  | Medal ID (Range Key) | Medal Name  | Attainment
-------------------+----------------------+-------------+--------------
U01                | M01                  | Gold        | Jun 3, 2019
-------------------+----------------------+-------------+--------------
U01                | M02                  | Silver      | Jun 2, 2019
-------------------+----------------------+-------------+--------------
U02                | M02                  | Gold        | Apr 1, 2019


<!--- Hash Key Only --->

Users_Medals

UserID_MedalID (HashKey) | Medal Name  | Attainment
-------------------------+-------------+--------------
U01#M01                  | Gold        | Jun 3, 2019
-------------------------+-------------+--------------
U01#M02                  | Silver      | Jun 2, 2019
-------------------------+-------------+--------------
U02#M02                  | Gold        | Apr 1, 2019


旨在构造表和应用程序数据以便快速检索,希望这对您有所帮助

更新

如果您的应用程序需要显示或获取奖牌列表,则应使用独立的Medals表格

Medals

ID (Hash Key)  | Name        | Points
---------------+-------------+--------
M01            | Gold        | 500
---------------+-------------+--------
M02            | Sliver      | 200
---------------+-------------+--------
M03            | Bronze      | 200

要获取奖牌的完整列表,需要Scan

要通过ID(哈希键)获取奖牌的详细信息(即名称,积分),应使用Get Item