mysql - AWS Cognito Identity ID 对 SQL 主键的适用性

标签 mysql sql amazon-web-services nosql amazon-cognito

我在一个平台上工作,其中唯一用户 ID 是来自 Amazon Cognito 身份池的身份 ID。看起来像这样:“us-east-1:128d0a74-c82f-4553-916d-90053e4a8b0f”

该平台有一个 MySQL 数据库,其中包含用户可以查看的项目表。我需要添加一个收藏夹表来保存每个用户的每个收藏夹项目。该表可能会增长到数百万行。

“收藏夹”表的布局如下所示:

userID, itemID, dateAdded

其中 userID 和 itemID 一起是复合主键。

我的理解是,这种类型的 userID(实际上是扩展的 UUID,需要存储为 char 或 varchar)的索引性能很差。因此,不鼓励将其用作数百万行的键或索引。

我的问题是:我的理解是否正确,我是否应该因为这个 key 而担心以后的性能?我可以采取任何缓解措施来降低性能风险吗?

我的整体数据库知识不是很好,所以如果这是一个大问题...将收藏夹列表移动到 NoSQL 表(其中 userID 作为键将允许恒定的访问时间),并检索数组最喜欢的项目 ID,用于 SELECT...WHERE IN 查询,是可接受的替代方案吗?

非常感谢!

最佳答案

好的,所以在这里我想说说为什么这不好,替代方案以及应用程序的读/写工作流。

为什么不:这不是一个好的架构,因为如果您的 Cognito 用户池出现问题,您无法为每个用户使用相同的 ID 重新填充它。此外,Cognito 现在正在更多地区提供;与去年相比。假设您的用户群在印度尼西亚,而现在 Cognito 在新加坡可用;您想将您的用户群从东京转移到新加坡;由于延迟问题;不仅您有移动用户的问题;您有填充数据库的问题;因此您的方法缺乏可扩展性可维护性,并且违反了单一责任原则(更新 Cognito 需要您更新数据库,反之亦然)。

备选方案:将db索引留给db域;并使用 username 作为您的数据库和 Cognito 用户池之间的链接。所以:

阅读工作流程为:

  1. 用户身份验证:用户进行身份验证并获取 token 。

  2. 您的应用会验证 token ,并从其负载中获取用户名。

  3. 您的应用根据用户名联系数据库并获取用户信息。

  4. 您的应用会将用户带到其页面并提供存储在数据库中的信息。

编写工作流程将是:

  1. 您的应用通过 token 获取用户的写入请求。

  2. 验证 token 。

  3. 根据唯一的用户名写入数据库。

关于mysql - AWS Cognito Identity ID 对 SQL 主键的适用性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49715894/

相关文章:

php - 从日期 = 今天的表中选择 *

mysql - 有关 Select 语句的 SQL 问题

scala - 如何在 Scala 或 Java 中模拟或 stub AWS SDK S3 存储桶调用?

java - 准备语句的 SQL 语法错误?

php - 从Mysql数据为Flot创建数组

php - 如何使用 php 从数据库(mysql)中检索特定值

mysql - 完成 MAX() 但使用更多表中的数据

php - 如何重新计算与另一个表相关的字段(Yii2 MySQL)

mysql - AWS RDS 实例的可用时间点恢复点

amazon-web-services - AWS 多可用区验证