在DynamoDB中设计“社交馈送”

问题描述 投票:10回答:3

此问题可能与任何基于NoSQL数据库的文档相关。

我正在制作一些特定的社交网络,并决定使用DynamoDB,因为它具有可伸缩性和无痛管理因素。数据库中只有两个主要实体:用户和帖子。

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

  • 家庭饲料(我追随的人的饲料)
  • 我/用户Feed(我的Feed或特定用户Feed)
  • 用户I /用户列表
  • 粉丝列表

这是我到目前为止提出的数据库方案(图例:__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:"[email protected]"
}

正如你所看到的那样,我直接在时间线集合中存储了我的所有帖子。这样我就可以使用日期和用户名(哈希和范围键)查询帖子。一切似乎都很好,但问题在于:

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

database database-design amazon-web-services database-schema amazon-dynamodb
3个回答
1
投票

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

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

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

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


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,您将获得最低的每用户成本。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.