照片喜欢,评论NOSql数据库设计

时间:2017-07-21 04:30:30

标签: database-design amazon-dynamodb social-graph

我正在尝试在像DynamoDB中的Instagram和Facebook这样的LIKE和COMMENT系统中实现

我有3张桌子,用户,照片和photo_likes

用户表和照片表包含user_id和photo_id键。

对于photo_likes表,我将photo_id作为键和likes_by列,我将user_id存储为列表。

所以,如果user_id 10,35喜欢photo_id 1,我将其存储为:

| photo_id | liked_by |
|     1    |  {10,35} |

如果这是正确的方法,我真的很困惑吗?或者我应该只是在他们是新的时候插入一个新行。

| photo_id | user_id  |
|     1    |    10    |
|     1    |    35    |

1 个答案:

答案 0 :(得分:1)

我将提供上述方法的优点和缺点。您可能需要根据应用程序所需的查询访问模式选择正确的方法。

方法1:

| photo_id | liked_by |
|     1    |  {10,35} |

优势与优势建议: -

  • 我的建议是将liked_by存储为NSSS而非List。所以它不会有重复。
  • 所有liked_by都出现在同一项目中。这将有助于检索并在需要时在GUI上显示结果

<强>缺点: -

  • 无法在非标量数据类型(SS,NS或List)上创建索引(如果需要)
  • 请注意DynamoDB中项目的最大大小(400 KB)。如果喜欢的数量增加到可能影响项目大小的意外值,这可能会影响数据模型

方法2:

| photo_id | user_id  |
|     1    |    10    |
|     1    |    35    |

您可以将photo_id定义为分区键,将user_id定义为排序键。

<强>优势: -

  • 您可以根据需要在user_id上创建索引
  • 您可以按user_id对数据进行排序(如果定义为排序键)
  • 无需担心400 KB项目大小

<强>缺点: -

  • 计算likes应该通过迭代值来在客户端完成。在方法1中,您可以使用一些array.length来获取likes计数
  • 查询结果集中的项目数量很高,可能难以处理。这一点取决于您是否有一个用例来获取照片列表及其likes计数或任何类似的sceanrio