Amazon web services AWS DynamoDB表格设计:在表格中存储两个用户ID和详细信息
我正在构建一个应用程序,其中两个用户可以相互连接,我需要将该连接(例如友谊)存储在DynamoDB表中。基本上,连接表有两个字段:Amazon web services AWS DynamoDB表格设计:在表格中存储两个用户ID和详细信息,amazon-web-services,amazon-dynamodb,nosql,Amazon Web Services,Amazon Dynamodb,Nosql,我正在构建一个应用程序,其中两个用户可以相互连接,我需要将该连接(例如友谊)存储在DynamoDB表中。基本上,连接表有两个字段: userIdA(散列键) userIdB(排序键) 我正在考虑在userIdB上添加一个索引来查询这两个字段。我应该存储一条记录(ALICE,BOB)或两条记录(ALICE,BOB;BOB,ALICE)的连接吗?第一个选项需要一个写操作和更少的空间,但我必须查询两次才能获得用户的所有连接。第二个选项需要两个写操作和更多的空间,但我只需要查询一次userId 用户
- userIdA(散列键)
- userIdB(排序键)
- 用户ID(散列键)
- 名称(排序键)
- 电子邮件
Connections:
1 userIdA userIdB
2 userIdB userIdA
第二个链接建议将重复数据的子集(“摘要”)保存到表中,以便只需一次查询就可以更快地读取。这意味着将用户详细信息也保存到连接表中,并将userid保存到用户表的属性中:
Connections:
# userIdA userIdB userDetails status
1 123 456 { userId: 456, name: "Bob" } connected
2 456 123 { userId: 123, name: "Alice" } connected
Users:
# userId name connections
1 123 Alice { 456 }
2 456 Bob { 123 }
这种数据库模型使查询连接变得非常容易,但如果某些用户详细信息可能发生更改,则似乎很难更新。另外,我不确定是否需要用户表中的userId,因为我可以很容易地查询userId
您认为该数据库模型如何?我建议您在表中有以下字段:
- 用户ID(散列键)
- 名称(排序键)
- 电子邮件
- 连接(逗号分隔或userId数组,假设一个用户有多个连接)
这种结构可以确保数据的一致性。一般来说,nosql数据库通常与两个假设相结合:
- 最终的一致性是可以接受的。也就是说,如果在更新过程中某些中间答案不正确,那么在应用程序设计中通常是可以接受的。也就是说,如果在alice成为Bob的朋友的几秒钟内,如果“is alice Bob's friend”返回true而“is Bob alice's friend”返回false,则可以
- 表现很重要。如果您使用nosql,通常是因为性能对您很重要。这几乎可以肯定,因为您关心最常见的操作的性能。(可能您遇到了一个问题,即某些不常见操作的性能太差,无法执行;在这种情况下,nosql通常不是解决方案)
- 您愿意降低不常见操作的速度,以提高常见操作的性能
- 假设性能已经足够令人担忧,nosql是应用程序的合理解决方案,那么您关心的几乎肯定是查询性能,而不是更新性能。如果您让更新变得更慢、更昂贵,以便查询更快,您可能会很高兴。这就是重点
- 您可能可以处理带外的更新—这就是一致性最终可能适合您的方式。您可以将更新操作提交到SQS队列,而不是在页面加载期间处理它们。因此,如果有人单击“确认好友”按钮,您可以排队请求实际更新数据库。即使这涉及到重建他们的用户行、重建朋友行,甚至更新他们有多少朋友的一些计数,这也是可以的
- 在每个方向上存储一个朋友行可能是有意义的,因此您只需要一个查询
- 将用户信息(如姓名和图片)存储在友谊行中复制的好友列表中可能是有意义的。请注意,每当名称或图片更改时,您都需要更新所有这些行
- 将好友存储在用户表中是否有意义还不太清楚。那可能会变大。此外,要保证最终的一致性可能很难。考虑一下如果你同时处理两个用户的友情更新会发生什么。一旦尘埃落定,你就不要以矛盾告终,这一点非常重要
- 每当您有非规范化的数据时,例如在每个方向复制行,或者将用户信息复制到友谊表中,您都需要某种方法来重新验证和修复数据。您希望编写的代码可以在后台扫描系统中由bug或崩溃的活动引起的不一致,并修复它们