nosql - 与 Dynamodb 的关系表
问题描述
我使用关系数据库工作了很长时间,现在我将使用 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 中,您应该首先尝试列出所有用例,然后尝试对表模式进行建模。
以下是我在您的应用程序中看到的用例
使用 userId(密码、年龄、姓名……)获取一位用户的用户信息
使用 userId (className, schoolName) 获取用户的学校信息
让所有学生在一所学校。
让所有学生在一所学校的一个班级。
基于这些给定的访问模式,这就是我设计架构的方式
| pk | sk | GSI1 PK | GSI1 SK |
| 12345 | metadata | | | Age:13 | Last name: Singh | Name:Rohan | ...
| 12345 | schoolMeta | SchoolName: DPS | DPS#class5 | className:5 |
使用上述模式,您可以将确定的用例解决为
使用 userId 获取一位用户的用户信息
Select * where pk=userId and sk=metadata
使用 userId 获取用户的学校信息
Select * where pk=userId and sk=schoolMeta
让所有学生在一所学校。
Select * where pk=SchoolId from table=GSI1
让所有学生都在一个班级。
Select * where pk=SchoolId and sk startswith SchoolId#className from table=GSI1
但是给定的模式存在以下缺点:
- 如果要更改学校名称,则必须更新太多行。
推荐阅读
- javafx - 右键单击 CodeArea 获取字符索引
- asynchronous - 当我尝试同时管理 Cisco 设备时,Asyncio 无法按预期工作
- c++ - 使用一个参数的模板函数时出错(与 2 一起使用)
- python - 图像多分类模型拟合期间遇到错误:语法错误:位置参数跟随关键字参数
- html - 如何阻止样式更改应用于具有递归组件的所有内容?
- linux - nginx启动创建孤儿进程
- cypress - 检查 cypress 中的动态元素
- blockchain - 无法使用 tessera 与仲裁节点发送交易
- javascript - Google.Script.Run - 不以第二种形式初始化
- javascript - React 历史推送数据作为参数到页面