我正在尝试做一些对于关系型数据库来说相对简单的事情,但是我不知道如何为非关系型数据库做这件事。
我正在尝试在AWS上制作一个简单的任务Web应用程序,使人们可以发布任务。
我有一个名为tasks的表,该表使用AWS Cognito所提供的身份验证令牌中的用户ID。我想知道如何返回用户信息。我不想依靠Cognito每次用户发送请求时都简单地调用它。因此,我的想法是创建另一个表来存储所有用户信息。但是,由于JOINS太糟糕了,这并不是一种非常无关紧要的处理方式。
所以,我想知道我是否应该执行以下任何操作
a)改为使用RDS
b)不使用Cognito并设置我自己的Auth系统
c)只需使用包含所有用户信息的表进行JOIN
d)每次对Cognito进行请求
答案 0 :(得分:1)
尽管我个人比较喜欢cognito的想法,但目前它有一些主要缺点...
您不能在不丢失用户密码的情况下备份/还原用户池,而且还必须实施自己的备份/还原。 一种解决方法是将用户密码保存在Cognito自定义属性中。
我期望通过使用api网关/ lambda授权器将所有用户数据都放在lambda上下文中,但不存在。还是在使用api网关模板映射
好东西api网关/ lambda授权者,最多可以缓存一个小时,不会再次调用authorizer函数,这似乎是一项重要功能。
我仅在一种实现中使用了它,最终也复制了DynamoDB中的用户。
从那以后我一直在避免。我希望他们能解决这些问题,因为看起来每个项目都包含一项服务,从而节省了大量时间。
在阅读您的帖子时,我问了自己同样的问题,也不确定答案
定价似乎合理。
每秒获取用户信息的默认5个请求似乎很奇怪,因为一次加载多个ajax api请求会消耗该请求。
答案 1 :(得分:0)
为此,在DynamoDB中,不需要其他表。如果访问模式指示您将信息存储在另一个对象中,则应将其存储在另一个对象中,但很有可能应将其存储在同一表中。听起来您在同一张表中需要两种不同的物品类型。
对于用户ID的任务PK和task :: your-task-id的SK。如果您知道任务ID,这将使您轻松获得用户的所有任务,甚至很容易获得特定任务。您甚至可能有一个属性,它是一个时间戳,然后有一个GSI,它是作为PK的userID和作为SK的时间戳。那么您可以在SK上使用begins_with运算符,并“对2019-04月份的所有用户任务进行分页”。
对于用户信息,将userID作为PK,将SK作为user_info,将属性作为用户信息。
这一挑战是,如果您要走极端,而一个用户正在每秒执行数千次操作。例如“所有由非常受欢迎的名人发布的推文”。如果您有这样的用例,那么也有一些解决方法,例如write sharding。这些只是供您使用的示例。在不了解您所有访问方式的情况下,我无法为您可能想做的所有事情建模。我强烈建议您去观看this presentation from reInvent 2018。