【问题标题】:Designing "social-feed" in DynamoDB在 DynamoDB 中设计“social-feed”
【发布时间】:2013-01-03 01:04:59
【问题描述】:

这个问题可能与任何基于文档的 NoSQL 数据库有关。

我正在制作一些特定于兴趣的社交网络,并决定使用 DynamoDB,因为可扩展性和无痛管理因素。数据库中只有两个主要实体:usersposts

常见查询的要求非常简单:

  • 主页动态(我关注的人的动态)
  • 我的/用户提要(我的提要或特定用户提要)
  • 我/用户关注的用户列表
  • 关注者列表

这是我目前想出的一个数据库方案(图例:__thisIsHashKey_thisIsRangeKey):

timeline = { // post 
    __usarname:"totocaster",
    _date:"1245678901345",
    record_type:"collection",
    items: ["2d931510-d99f-494a-8c67-87feb05e1594","2d931510-d99f-494a-8c67-87feb05e1594","2d931510-d99f-494a-8c67-87feb05e1594","2d931510-d99f-494a-8c67-87feb05e1594","2d931510-d99f-494a-8c67-87feb05e1594"],
    number_of_likes:123,
    description:"Hello, this is cool"
} 

timeline = { // new follower 
    __usarname:"totocaster",
    _date:"1245678901345",
    type:"follow",
    follower:"tamuna123"
}

timeline = { // new like 
    __usarname:"totocaster",
    _date:"1245678901345",
    record_type:"like",
    liker:"tamuna123",
    like_date:"123255634567456"
}

users = {
    __username:"totocaster",
    avatar_url:"2d931510-d99f-494a-8c67-87feb05e1594",
    followers:["don_gio","tamuna123","barbie","mikecsharp","bassman"],
    following:["tamuna123","barbie","mikecsharp"],
    likes:[
    {
        username:'barbie',
        date:"123255634567456"
    },
    {
        username:"mikecsharp",
        date:"123255634567456"
    }],
    full_name:"Toto Tvalavadze",
    password:"Hashed Key",
    email:"totocaster@myemailprovider.com"
}

如您所见,我想将所有帖子直接存储在时间线集合中。这样我可以使用日期和用户名(哈希和范围键)查询帖子。一切似乎都很好,但问题出在这里

我无法一次性查询用户时间线。这将是系统最需要的查询之一,我无法提供有效的方法来做到这一点。请帮忙。谢谢。

【问题讨论】:

  • 这对我来说是一个持续的问题,而我正在计划我的社交网络
  • 那么您希望能够从时间线表中获取所有用户数据吗?您可以只查询该用户名的哈希键吗?如果不是这种情况,请给我一个更详细的查询示例,可能是简单的类似 SQL 的语法。即SELECT all from timeline where USERNAME = totacaster

标签: database database-design amazon-web-services database-schema amazon-dynamodb


【解决方案1】:

我碰巧每天都在处理新闻提要。 (Stream-Framework 的作者并创立了 getstream.io)

我看到的最常见的解决方案是:

  • 卡桑德拉 (Instagram)
  • Redis(昂贵,但简单)
  • MongoDB
  • DynamoDB
  • RocksDB (Linkedin)

大多数人要么在写时使用扇出,要么在读时使用扇出。这使得构建一个可行的解决方案变得更加容易,但它很快就会变得昂贵。您最好的选择是结合使用这两种方法。因此,在大多数情况下,在写入时进行扇出,但对于非常流行的提要,请将它们保存在内存中。

Stream-Framework是开源的,支持Cassandra/Redis & Python

getstream.io 是基于 Go 和 Rocksdb 构建的托管解决方案。

如果您最终使用 DynamoDB,请务必设置正确的分区键: https://shinesolutions.com/2016/06/27/a-deep-dive-into-dynamodb-partitions/

另请注意,基于 Redis 或 DynamoDB 的解决方案很快就会变得昂贵。通过利用 Cassandra 或 RocksDB,您将获得最低的每位用户成本。

【讨论】:

    【解决方案2】:

    我会查看 Titan 图形数据库 (http://thinkaurelius.github.com/titan/) 和 Neo4j (http://www.neo4j.org/)。

    我知道 Titan 声称可以很好地扩展大型数据集。

    最终,我认为您的模型可以很好地映射到图表。用户和帖子将是节点,然后您可以通过边任意连接它们。一个用户(节点)是另一个用户(节点)的朋友(边)。

    用户(节点)在其时间轴中有许多帖子(节点)。然后你可以通过图表运行有趣的遍历。

    【讨论】:

    • OP 是关于 DynamoDB 的,你是说它对于 SN 来说真的不是一个好的选择吗?
    【解决方案3】:

    您还可以使用非常适合社交网络的 Amazon Neptune (https://aws.amazon.com/neptune/) (Graph DB)。我认为 DynomoDB 不是您的用例的好选择。

    【讨论】:

      猜你喜欢
      • 2012-09-26
      • 1970-01-01
      • 2016-03-09
      • 2020-08-07
      • 2018-04-27
      • 1970-01-01
      • 1970-01-01
      • 2019-03-10
      • 2023-03-23
      相关资源
      最近更新 更多