2

我需要在dynamodb裏面創建一個朋友表。我嘗試着決定如何設計表格並查看亞馬遜團隊成員曾經推薦過的內容。DynamoDB Friends設計

http://www.slideshare.net/AmazonWebServices/amazon-dynamodb-design-patterns-for-ultrahigh-performance-apps-dat304-aws-reinvent-2013-28436991

他們reccommend一個2路的關係:

Friend 1 | Friend 2 
------------------- 
BOB  | ALICE 
ALICE | BOB 
ALICE | JOHN 

然後你就可以在朋友1查詢來獲取所有的朋友。我看到的問題是這不是跨國的。比如說BOB不想再和ALICE成爲朋友。我們需要刪除2條記錄,以便當BOB和ALICE查詢他們的朋友列表時,他們不會出現在任何列表中。如果只有一次刪除操作成功(例如,網絡丟失或吞吐量超出),問題是什麼?然後說BOB愛麗絲仍然是一個朋友,但對於愛麗絲BOB不再是朋友。這是不一致的。我認爲這將是非常糟糕的做法。我錯過了什麼,因爲這對我來說是一個理想的設計,但是對於我來說這個問題會讓它變得不可接受?我的想法是建立一種單向關係,然後在朋友2上創建一個全局二級索引,這樣我就可以將我的讀數翻倍(在表上讀取1次,在索引上讀取1次),但只有一個項目用於關係,如果說我需要刪除它,這將是安全的,因爲如果BOB或ALICE不想再成爲朋友,只有一個項目可以刪除。建議的解決方案是否合適,我錯過了什麼或存在缺陷,是否有更好的解決方案?如果我願意的話,我想避免使用全局索引,因爲它會自動加倍我的成本,但目前我沒有看到更好的方法。

回答

0

我會在鏈接中提到的解決方案,想象一下,有100個用戶使得另外100個朋友可以在桌面上進行100 * 100 * 2的寫操作。人們更有可能每天交朋友,但與添加朋友相比,取消朋友的可能性要小得多。在這個解決方案中,你可以避免任何索引,以及你之前說過的。現在

您要刪除的問題

Solution 1: 
AWS has introduced Lambda which would be effective in this, configuring with 
DynamoDB on deletion of row you can trigger a lambda function which will 
check if both the operation was performed successfully or not. 

Solution 2: 
Rather then directly removing the row from DynamoDB put the request in a SQS queue, 
A reader will read the message and remove both the records. 
+0

感謝您的答覆。我對AWS不太熟悉,Lambada或SQS會保證交易嗎?假設Lambada或SQS嘗試進行操作,並且由於超出dynamodb規定而被拒絕,它會自動重試,直至成功或它如何工作,使其不同於直接調用dynamodb? – user2924127

+0

@ user2924127 SQS是一個排隊系統,可以保證消息至少被傳遞一次,您可以檢查操作是否成功,然後刪除消息,然後再次嘗試。這在Lambda的情況下不會相同 –