2017-02-18 35 views
0

我正在使用AWS Mobile HUD和连接服务构建应用程序,最突出的是Cognito & DynamoDB。目前,我正面临一个问题,需要设置一个允许我在DynamoDB项目上存储用户相关信息的方案(反之亦然)。AWS DynamoDB记住用户的项目

方案

运行1

  1. 用户A是直接从DynamoDB的[RootItem] = {RootItem_1, RootItem_2, RootItem_3}列表(检查:正常工作)
  2. 用户A或者驳回RootItem_1(标记为 '不感兴趣' in app)

运行2

  1. 用户A登录到应用程序
  2. 用户A拉[RootItem] = {}
  3. 用户A的列表应该只得到RootItems这是驳回交付给客户
  4. 名单应该是{RootItem_2, RootItem_3}

作为新的非关系数据/ NoSQL,我不是确定解决这个问题的最好方法是什么。可能的思路:

  • 存储用户ID的RootItem_1排除它在扫描[问题:将有可能是成千上万的用户驳回同一项目] RootItem_1的
  • 商店UUID到用户数据上cognito,缓存拉之前本地并排除uuid的拉
  • 创建具有排除/解除[userid,rootItem_uuid]的表,首先查询以获取用户排除列表。 >潜在的性能问题?

这将是巨大的,得到一些建议的是在NoSQL的环境来处理这个最好的办法。

+0

这是一个looong前我试过dynamodb,但你应该避免扫描操作,如果可能的话,这是非常沉重的。你看过全球二级指标吗?这可能会减少对SCAN操作的需求,并允许您在表格上查询。 http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForGSI.html – 2017-02-18 13:39:04

+0

我知道,扫描并不完美,问题是我必须做相当复杂的查询,这似乎是不可能的使用查询。 aka {property 1 == x &&属性2 beween(a,b)或(c,d)&&属性3 = a或b,...}总的来说,我期望筛选范围和匹配6-7不同属性,使用OR和AND操作,到目前为止,我认为这是不可能的 –

+0

这就是我们从DynamoDB中移出的原因。当你不需要进行“高级”查询时,它非常出色,但是当你需要更多条件时,你会遇到墙壁。这,并与此一起:http://stackoverflow.com/questions/41520123/getting-full-access-to-dynamodb-from-my-ios-app-using-aws-cognito-developer-iden/41676547#41676547检查我的答案注意这个问题。由于您使用的是Cognito和iOS,我假设您直接连接到DynamoDB,这也是要注意的事情(不要吓跑你)。 – 2017-02-18 16:45:34

回答

0

这当然取决于数量或RootItems,以及每个用户有多少活动(未解雇)的RootItems。但我会保留一个RootItems列表(或引用它)并将其存储在每个用户的表中,并在用户关闭这些项目时维护该列表。或者甚至有可能大部分项目都被解雇了,然后它会成为用户保存项目的列表?

+0

基本上,用户可以看到未来所有符合其标准的项目列表。然后,他继续完成所有这些任务,要么解雇他们,要么“回忆”他们。在一个完美的世界里(成功的风险),可能会有〜1000+个rootItems符合用户的标准。我倾向于这个解决方案,有一个额外的表,其中userID是关键,我存储{userId,rootItemID,日期},并且可以定期清理'旧'已解雇的项目,因为它们不再需要,因为过去的数据对于应用程序。我会尝试这样设置它,看看它是否有效。 –

+0

它工作正常,如果它是最高性能的方式,它还不是100%。我选择在DynamoDB上创建引用,在登录时下载它们1次,然后保留本地引用并在本地执行过滤 –