在DynamoDB中设计"社交馈送"

tot*_*ter 11 database database-design amazon-web-services database-schema amazon-dynamodb

此问题可能与任何基于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:"totocaster@myemailprovider.com"
}
Run Code Online (Sandbox Code Playgroud)

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

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

Thi*_*rry 5

我碰巧每天都与新闻提要一起工作。(Stream-Framework 的作者并创立了 getstream.io)

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

  • 卡桑德拉(Instagram)
  • Redis(昂贵,但简单)
  • MongoDB
  • 动态数据库
  • 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,您将获得最低的每用户成本。


rya*_*234 1

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

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

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

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