照片点赞、评论 NOSql 数据库设计

Photo LIKE, COMMENTS NOSql database Design

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

我有 3 个 table、用户、照片和 photo_likes

用户 table 和照片 table 有 user_id 和 photo_id 键。

和 photo_likes table,我有 photo_id 作为键和 liked_by 列,我将 user_id 存储为列表。

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

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

我真的很困惑这样做是否正确?或者我应该在他们是新的喜欢的时候插入一个新行。

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

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

方法一:

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

优势&建议:-

  • 我的建议是将 liked_by 存储为 NSSS 而不是列表。这样就不会重复了。
  • 所有 liked_by 都出现在同一项目中。如果需要,这将有助于检索和在 GUI 上显示结果

缺点:-

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

方法二:

| 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