14

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

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

常见查询的要求很简单:

  • 家庭动态(我关注的人的动态)
  • 我的/用户提要(我的提要,或特定用户提要)
  • 我/用户关注的用户列表
  • 关注者名单

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

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

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

4

3 回答 3

3

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

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

  • 卡桑德拉 (Instagram)
  • Redis(昂贵,但简单)
  • MongoDB
  • 动态数据库
  • RocksDB(领英)

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

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

于 2017-12-13T23:43:55.997 回答
1

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

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

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

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

于 2013-03-01T06:06:42.950 回答
0

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

于 2019-03-06T10:01:08.227 回答