我想在DynamoDB中复制以下关系
用户可以拥有许多奖牌
奖章可以授予许多用户
我读到您应该只在DynamoDB中使用一个表,但是我还没有想到解决该问题的方法。
我首先想到的是创建一个奖牌表,然后在用户表中让用户获得奖牌ID列表。
这需要对数据库的更多请求,但听起来还是不好。
有什么建议吗?
答案 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中
数据略有重复(即为每个用户复制了勋章名称),这很可能会在update
,delete
期间受到重罚(例如,如果勋章名称需要从“金”更改为改为“白金”,则需要对所有记录进行扫描并分别进行更新
<!-- 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