【问题标题】:Modeling many to many with DynamoDb (NoSQL)使用 DynamoDb (NoSQL) 建模多对多
【发布时间】:2019-02-24 14:04:37
【问题描述】:

我正在做一个项目,我需要存储 USERSTECHNIQUESSKILLSTECHNIQUESSKILLS 都与 USER 具有 N:M 关系。

我是 NoSQL 的新手,无法理解这个想法。该应用程序将为用户提供将这些技术技能添加到USERS的机会。然后我需要构建一个查询 TECHNIQUESSKILLS 的函数,并找到所有具有查询的 TECHNIQUESSKILLS 的用户>。

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

我想我只需要看看有经验的 NoSQL 人会如何解决这个问题来让我继续前进。

【问题讨论】:

    标签: database-design nosql amazon-dynamodb


    【解决方案1】:

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

    使用 USERS 作为分区键并使用 TECH 和 SKILL 属性创建表,并生成复合 TECHSKILL 字段作为排序键。您可以在输入解析器中添加 TECHNIQUE 字段值(只需将 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 等)。现在让 USER 在一年中的部分时间拥有 TYPE_A 许可证,然后她获得 TYPE_C(因此,新记录),但随后 TYPE_C 认证失效,她在不同的日期范围内回到 TYPE_A 并且您有一个主键碰撞,你会得到一个元组列表,而不仅仅是一个,你必须处理它。如果您不想传输/检查/排序查询返回(可能是一个很长的列表!),您可能需要不同的设计,可能需要将开始/结束日期作为索引排序键的一部分。

    【讨论】:

    • 很抱歉没有感谢您提供最出色的答案,我不得不离开该项目一段时间并忘记了它。现在我回来了,会考虑你的例子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 2019-08-21
    • 2016-10-12
    • 1970-01-01
    • 2019-08-04
    • 2021-04-09
    相关资源
    最近更新 更多