适用于SQL主键的AWS Cognito Identity ID

时间:2018-04-08 08:19:53

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

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

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

'favorites'表格的布局如下:

userID, itemID, dateAdded

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

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

我的问题是:我的理解是否正确,我是否应该担心以后因此问题导致的表现?我可以采取哪些缓解措施来降低性能风险?

我的整体数据库知识不是很好,所以如果这是一个大问题...将收藏的列表移动到NoSQL表(其中userID作为键将允许持续访问时间),并检索数组在SELECT ... WHERE IN查询中使用的被收藏项目ID是否可以接受?

非常感谢!

2 个答案:

答案 0 :(得分:3)

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

为什么不:这不是一个好的架构,因为如果您的Cognito用户池出现问题,您就无法为每个用户重新填充相同的ID。此外,Cognito现在在更多地区提供;与去年相比。让我们说你的用户&#39;基地在印度尼西亚,现在Cognito可在新加坡使用;您想将您的用户池从东京迁移到新加坡;因为延迟问题;不仅你有移动用户的问题;你有填充数据库的问题;因此,您的方法缺乏可扩展性可维护性并打破单一责任原则(更新Cognito需要您更新数据库,反之亦然)。< / p>

替代解决方案:将db索引保留到db域;并使用用户名作为数据库与Cognito用户池之间的链接。所以:

阅读工作流程将是:

  1. 用户身份验证:用户验证并获取令牌。

  2. 您的应用验证令牌,并从其有效负载获取用户名。

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

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

  5. 工作流程将是:

    1. 您的应用获取带有令牌的用户的写请求。

    2. 验证令牌。

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

答案 1 :(得分:2)

关于MySQL,如果您对主键使用UserID和CognitoID组合,则会对查询性能产生负面影响,因此不建议用于大型数据集。

然而,除非您有复杂的查询,否则使用NoSQL DynamoDB的甚至UserID更合适。您还可以使用AWS DynamoDB fine-grained access control连接Cognito Identity Pool来强制实施安全性。