照片点赞、评论 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
存储为 NS
或 SS
而不是列表。这样就不会重复了。
- 所有
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
我正在尝试在 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
存储为NS
或SS
而不是列表。这样就不会重复了。 - 所有
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