我使用关系数据库已经很长时间了,现在我将使用DynamoDB。之后,在使用关系数据库后,我努力在DynamoDB中设计一些当前的SQL表。特别是,决定分区和排序键。我将尝试举一个例子来解释:
当前表格:
Student: StudentId(PK), Email, First name, Last name, Password, SchoolId(FK)
School: SchoolId(PK), Name, Description
我当时正在考虑在DynamoDB中合并这些表,并使用SchoolId作为分区键,使用StudentId作为排序键。但是,我看到一些类似的示例使用StudentId作为分区键。
然后我意识到,我们在每个登录功能中都使用“用户名”,因此应用程序将大量使用“用户名”(有时使用密码或身份验证令牌)进行查询。这种情况让我思考。 SchoolId作为分区密钥,而Username作为排序密钥。
我需要一些有关在那种情况下的最佳实践的想法,以及一些建议,以使我更好地理解NoSQL和DynamoDb概念。
答案 0 :(得分:3)
在NoSql中,您应该首先尝试列出所有用例,然后再对表模式进行建模。
下面是我在您的应用程序中看到的用例
获取一个具有userId(密码,年龄,姓名等)的用户的用户信息
获取具有userId(className,schoolName)的用户的学校信息
让所有学生集中在一所学校。
让所有学生在一所学校的一个班级学习。
基于这些给定的访问模式,这就是我设计架构的方式
Select * where pk=userId and sk=metadata
使用上述架构,您可以将识别出的用例解决为
获取一个具有userId的用户的用户信息
Select * where pk=userId and sk=schoolMeta
获取具有userId的用户的学校信息
Select * where pk=SchoolId from table=GSI1
让所有学生集中在一所学校。
Select * where pk=SchoolId and sk startswith SchoolId#className from table=GSI1
让所有学生都上一堂课。
{{1}}
但是给定的架构存在以下缺点