8

此問題可能與任何基於文檔的NoSQL數據庫相關。在DynamoDB中設計「social-feed」

我正在製作一些感興趣的特定社交網絡,並決定使用DynamoDB,因爲它具有可伸縮性和無痛苦管理因素。數據庫中只有兩個主要實體:用戶帖子

要求共同查詢很簡單:

  • 首頁飼料(的人進我以下)
  • 我/用戶飼料(我的飼料,或特定的用戶飼料)
  • 用戶
  • 列表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]" 
} 

正如你可以看到我來了直接卷繞儲存我所有的文章在時間軸集合。這樣我可以使用日期和用戶名(哈希和範圍鍵)查詢帖子。一切似乎很好,但這裏是問題

我無法一次查詢用戶時間線。這將是系統最需要的查詢之一,我無法提供有效的方法來做到這一點。請幫忙。謝謝。

+0

對於我來說這是一個持續的問題,而我計劃我的社交網絡 – MCKapur

+0

因此,您希望能夠從時間表中獲取所有用戶數據?你可以只查詢該用戶名的hashkey?如果情況並非如此,請給我一個稍微更詳細的查詢示例,可能採用簡單的類似SQL的語法。即'SELECT all from timeline where USERNAME = totacaster' – greg

回答

1

我會查看Titan圖形數據庫(http://thinkaurelius.github.com/titan/)和Neo4j(http://www.neo4j.org/)。

我知道Titan聲稱可以很好地擴展大型數據集。

最終我認爲你的模型很好地映射到一個圖上。用戶和帖子將是節點,然後您可以通過邊緣任意連接它們。用戶(節點)是另一個用戶(節點)的朋友(邊緣)。

用戶(節點)在其時間線中有許多帖子(節點)。然後你可以通過圖表運行有趣的遍歷。

+0

儘管OP是關於DynamoDB的,你是不是說它對於一個SN來說不是一個好的選擇? – SuperUberDuper

0

我碰巧每天都在處理新聞提要。 (流框架的作者和創辦getstream.io)

最常見的解決方案,我看到的是:

  • 卡桑德拉(Instagram的)
  • Redis的(昂貴,但易)
  • MongoDB的
  • DynamoDB
  • RocksDB(LinkedIn)

最人們在寫作時使用扇出或在閱讀時使用扇出。這使得構建工作解決方案變得更加容易,但它可能會很快變得昂貴。你最好的選擇是使用這兩種方法的組合。所以在大多數情況下,大多數情況下都要寫扇子,但是對於非常受歡迎的Feed,它們會將它們保存在內存中

Stream-Framework是開源和支持卡桑德拉/ Redis的& Python的

getstream.io是一個託管解決方案建立在圍棋& Rocksdb的頂部。

如果你最終使用DynamoDB一定要設置正確的分區鍵: https://shinesolutions.com/2016/06/27/a-deep-dive-into-dynamodb-partitions/

還要注意的是基於Redis的或DynamoDB解決方案將得到昂貴很快。您將通過利用Cassandra或RocksDB獲得每位用戶的最低成本。