DynamoDB Friends设计

时间:2015-12-04 18:00:16

标签: amazon-web-services database-design amazon-dynamodb database nosql

我需要在dynamodb中创建一个朋友表。我正在尝试决定如何设计表格,并查看一下亚马逊的团队成员推荐的内容。

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

他们推荐双向关系:

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

然后你可以在朋友1上查询以获得所有朋友。我看到的问题是这不是跨国的。例如,说BOB不想再与ALICE成为朋友。我们需要删除2条记录,这样当BOB和ALICE查询他们的朋友列表时,他们就不会显示在任何一个列表中。问题是如果只有一个删除操作成功(例如网络丢失或吞吐量超过)?然后说对于BOB爱丽丝仍然是朋友,但对于Alice BOB不再是朋友。这是不一致的。我认为这将是非常糟糕的做法。我错过了什么,因为这对我来说是一个理想的设计,但对我来说这个问题会让它不被接受吗?我的想法是有一个单向关系,但然后在朋友2上创建一个全局二级索引,这样我就可以加倍读取(在表上读取1次,在索引上读取1次)但是只有一个项目用于关系,如果说我需要删除它是安全的,因为如果BOB或ALICE想要不再是朋友,只有一个项目要删除。建议的解决方案是否良好,我遗漏了什么或存在缺陷,是否有更好的解决方案?我想避免使用全球指数,因为它可以自动使我的成本加倍,但目前我看不到更好的方法。

1 个答案:

答案 0 :(得分: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.