使用DynamoDb(NoSQL)进行多对多建模

时间:2018-09-20 09:42:38

标签: database-design nosql amazon-dynamodb

我在需要存储 USERS TECHNIQUES SKILLS 的项目中使用

im工作。 TECHNIQUES SKILLS 均具有 USER 的N:M表示。

我是NoSQL的新手,无法解决这个问题。该应用程序将使用户有机会将这些技术技能添加到用户。然后,我需要构建一个查询 TECHNIQUES SKILLS 的函数,并找到具有查询的 TECHNIQUES SKILLS 的所有用户>。

我参加了Udemy课程,但没有得到我所理解的示例。在stackoverflow上,有几个示例,但它们与我的示例不同。

我想我只需要看看一个有经验的NoSQL人员如何解决这个问题就可以使我前进。

1 个答案:

答案 0 :(得分:3)

我的第一个想法(我只是自己学习DynamoDB,所以这可能很幼稚)将是一个带有复合排序键和全局二级索引的USER表:

使用USERS作为您的分区键以及TECH和SKILL属性创建表,并生成一个复合TECHSKILL字段作为您的排序键。您可以在输入解析器中添加TECHSKILL字段值(只需将TECHNIQUE和SKILL用分隔符(例如TECHNIQUE#SKILL之类的东西)连接即可。这样,您可以使用排序键上的查询条件(例如“ starts-with”)来确定给定的USER是否具有特定的TECH或SKILL。

然后在TECH和SKILL以及TECH:SKILL字段上添加全局二级索引(因此您具有三个GSI),每个索引都以USER作为其排序键。现在,您可以查询TECH GSI以查找具有给定TECH的所有USER,或者查询SKILL GSI,甚至可以查询具有给定TECH:SKILL组合的所有USER。

通过这种多重GSI方法,您可以针对不同的查询以不同的方式管理读/写容量。

如果用户可以多次拥有TECHSKILL组合,这可能会效率低下(我认为)。例如,假设TECHNIQUE是“ driver”,并且“ SKILL”字段持有驾驶员许可证类别(TYPE_A,TYPE_C等)。现在,让该用户在一年的一部分时间内拥有TYPE_A许可证,然后获得TYPE_C(新记录),但随后TYPE_C认证失效,并且她在不同的日期范围内返回TYPE_A,并且您拥有主键冲突,您将返回一个元组列表,而不仅仅是一个元组列表,您将不得不处理它。如果您不希望转移/检查/排序查询返回信息(也许是一长串!),则可能需要其他设计,可能需要将开始/结束日期作为索引排序键的一部分。