2012-05-17 79 views
0

我在如何在DynamoDB中對查詢建模時遇到困難。讓我們以twitter爲例,我想回答的問題是,我跟隨的人向我展示了最近的20條推文。多個散列鍵上的DynamoDB查詢

我有3個迪納摩表:

Users 
UserUID - Hash 
Handle 

Following 
UserUID - Hash 
FollowingUserUID - Range 

Tweets 
UserUID - Hash 
Tweet 
PostedDate - Range 

什麼是我需要做什麼來回答這個問題的步驟,爲人民UserUID 1234以下顯示最近的20個鳴叫。

步驟我:

第1步:所有的人的名單UserUID 1234以下。

步驟2(我在哪裏丟失):對於標識的節目我最近的20個鳴叫名單。

我不知道如何構造第二個查詢,因爲我需要在ID列表上過濾哈希鍵,並使用限制和可能的範圍過濾器。因此,我不認爲我可以使用BatchGetItemRequest。這是可能做到還是讓我的問題變得比需要更難?

回答

3

第2步(我丟失的地方):對於Id列表,顯示最近的20條推文。

沒有直接回答這個問題,因爲我們不能只是查詢「ORDER BY PostedDate」

惟一可行的辦法,以有效地完成在DynamoDB這樣一個複雜的映射是由存儲數據冗餘。你可以得到每個朋友的最新20條推文,然後像你已經提出的那樣,在你的web應用中對它進行排序。但是,猜測有人跟隨1000個用戶,這會導致一個用戶請求的1000個查詢。

於是我想出了一個可能的解決方案如下:

  1. 通過創建一個寫推入鳴叫表:添加一個新的鳴叫到數據庫的

    Users 
    UserUID - Hash 
    Handle 
    
    Following 
    UserUID - Hash 
    FollowingUserUID 
    
    FollowedBy 
    UserUID - Hash 
    FollowedByUserUID 
    
    RecentTweetsOfFriends 
    UserID - Hash 
    PostedDate - Range 
    TweetUUID 
    
    RecentTweetsOfUser 
    UserID - Hash 
    PostedDate - Range 
    TweetUUID 
    
    Tweets 
    TweetUUID - Hash 
    Tweet 
    UserID 
    PostedDate 
    

    程序新的UUID

  2. 獲取所有用戶關注正在從「FollowedBy」表提交新Tweet的用戶
  3. 將新的Tweet連接到t他表「RecentTweetsOfUser」和「RecentTweetsOfFriends」

對於這個解決方案,你不需要「下面的」表格,但我把它放在那裏,因爲它可能是整潔保存它的兩個方向。