【问题标题】:Relational table to Dynamodb与 Dynamodb 的关系表
【发布时间】:2019-03-14 19:28:29
【问题描述】:

我长期使用关系数据库,现在我将使用 DynamoDB。之后,使用关系数据库,我正在努力在 DynamoDB 中设计我们当前的一些 SQL 表。特别是,决定分区和排序键。我将尝试用一个例子来解释:

当前表:

Student: StudentId(PK), Email, First name, Last name, Password, SchoolId(FK)
School: SchoolId(PK), Name, Description

我正在考虑在 DynamoDB 中合并这些表,并使用 SchoolId 作为分区键,使用 StudentId 作为排序键。但是,我看到一些类似的示例使用 StudentId 作为分区键。

然后我意识到,我们在每个登录功能中都使用“用户名”,因此应用程序会经常使用“用户名”(有时使用密码或身份验证令牌)进行查询。这种情况让我思考; SchoolId 作为分区键,用户名作为排序键。

我需要一些关于在这种情况下最佳实践的想法和一些建议,以帮助我更好地理解 NoSQL 和 DynamoDb 概念。

【问题讨论】:

    标签: nosql amazon-dynamodb relational-database


    【解决方案1】:

    在 NoSql 中,您应该首先尝试列出所有用例,然后尝试对表模式进行建模。

    以下是我在您的应用程序中看到的用例

    1. 使用 userId(密码、年龄、姓名……)获取一位用户的用户信息

    2. 使用 userId(className,schoolName)获取用户的学校信息

    3. 获取一所学校的所有学生。

    4. 获取一所学校一个班级的所有学生。

    基于这些给定的访问模式,这就是我设计架构的方式

    |    pk     |     sk        |   GSI1 PK          |  GSI1 SK            |  
    |  12345    |    metadata   |                    |                     | Age:13 | Last name: Singh | Name:Rohan | ...
    |  12345    |    schoolMeta |  SchoolName: DPS   | DPS#class5          | className:5 | 
    

    使用上述架构,您可以将识别的用例解决为

    1. 使用 userId 获取一位用户的用户信息

      Select * where pk=userId and sk=metadata

    2. 使用 userId 获取用户的学校信息

      Select * where pk=userId and sk=schoolMeta

    3. 获取一所学校的所有学生。

      Select * where pk=SchoolId from table=GSI1

    4. 让所有学生在一个班级。

      Select * where pk=SchoolId and sk startswith SchoolId#className from table=GSI1

    但给定的架构存在以下缺点:

    1. 如果要更改学校名称,则必须更新太多行。

    【讨论】:

    • 感谢您的详细回答,这很有帮助。我还有两个问题;对于第一个用例:“使用 userId (password, age, name,...) 获取一个用户的用户信息”,应用程序将使用“username”而不是 userID 获取用户信息。在那种情况下,您认为我需要使用“用户名”作为分区键吗?我的第二个问题是关于排序键的,在我的例子中,你所说的“元数据”指的是什么。再次感谢您的详细回答。
    • pk 应该是您认为您将尝试对其进行提取的键。对此没有任何限制,唯一的问题是它应该足够随机,以免发生热分区。 metadata 只是一个键,您也可以使用任何其他常量名称,唯一需要注意的是,此名称以后不能更改,应用程序应该知道此名称以进行提取
    猜你喜欢
    • 2016-12-07
    • 2015-05-15
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    • 2021-06-16
    • 2020-04-18
    • 1970-01-01
    • 2021-07-10
    相关资源
    最近更新 更多