【问题标题】:Amazon DynamoDB - Designing tables based on friendshipsAmazon DynamoDB - 根据友谊设计表格
【发布时间】:2014-01-22 14:58:30
【问题描述】:

在我的测试项目中,我试图模拟一个允许用户发布个人状态消息的小型社交网络。

我会使用 DynamoDB 来提供状态消息,使用 MySQL 来提供用户友谊。 我的疑问是:如何设计我的发电机表来存储状态消息并仅获取朋友用户的状态?

例如,我需要从 Dynamo 获取按创建日期排序的朋友的所有状态。我想到了一个带有这个索引的表:

  • HashKey : user_id
  • RangeKey:creation_date
  • 属性 1:消息
  • 属性2:....

但是,我可以只过滤我朋友在这张桌子上的状态吗?

【问题讨论】:

    标签: mysql database amazon-web-services nosql amazon-dynamodb


    【解决方案1】:

    问题是,用户可以有一个朋友列表。给定一个用户,我们想要获取他/她的所有朋友(姓名+在线/离线状态)。我们如何在 DynamoDB 中做到这一点?

    首先,您需要为每个用户分配一个 user_id。这将是该用户的唯一标识符,也就是一个指针。

    您可以使用 Hash-Range 表来存储友谊数据。该表的哈希键和范围键都是 user_id。在 DynamoDB 中,每个哈希键可以有多个范围键。哈希键将是一个用户,我们可以将她所有朋友的用户 ID 存储在范围键中。

    假设 user_1 是 user_2 和 user_3 的朋友

    "Friendship table in DynamoDB"
    HashKey   RangeKey
    user_1    user_2
    user_1    user_3
    user_2    user_1
    user_3    user_1
    

    您可以有另一个存储用户信息的表

    "User table in DynamoDB"
    HashKey   name    isLoggedin
    user_1    J       true
    user_2    swaggyp false
    user_3    furion  false
    

    现在你想获得 user_1 的朋友。您可以使用 hash_key 等于 user_1 执行 DynamoDB 查询。在上面的例子中,你会得到 2 行:

    (user_1, user_2) (uiser_1, user_3)。

    现在您知道 user_2 和 user_3 是 user_1 的朋友。您可以使用User表来获取user_2和user_3的在线状态。

    【讨论】:

      【解决方案2】:

      假设您的 MySql 返回用户朋友的 ID:

      例如。 1,2,3
      现在您将调用 dynamoDB 表并在 Batchgetitem* 的帮助下通过传递从 SQl 获得的 id 数组来获取所有项目

      DynamoDB 架构:

      哈希:user_id
      范围:日期和时间
      其他属性

      默认情况下,DynamoDB 将按范围字段排序(您可以使其升序/降序),因此您将获得您所询问的键的所有数据。

      *您可以参考http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchGetItem.html批量获取物品

      希望对您有所帮助。

      【讨论】:

      • 您好,Harshal,感谢您的回复。我有一个疑问:如果我使用带有多个 id 的 BatchGetItem 方法,结果是单独排序还是一起排序?
      • 它将单独排序,因为内部一次只传递一个 Id,它将获取该 Id 的所有数据,然后是下一个 Id,依此类推。
      • 没关系,但如果我需要将我的查询限制为 20 项?我看到我可以使用 DynamoDBQueryExpression 但我不能将它用于 batchLoad() 方法。你有什么想法吗?
      • 我不确定我们是否可以在 batchLoad() 中使用限制..抱歉。
      • 嗨,Harshal,该解决方案是否可扩展?例如,如果用户有 10k 关注者
      猜你喜欢
      • 1970-01-01
      • 2012-09-26
      • 2015-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-10
      • 1970-01-01
      • 2015-07-01
      相关资源
      最近更新 更多