React+AppWrite社交APP:用户集合中如何存储关注与粉丝数据?
AppWrite用户关注关系存储方案解析
优先推荐:存储用户ID数组 + 批量查询
你之前担心的多次调用问题其实可以通过AppWrite的批量查询解决,不用逐个请求。具体来说,把followings和followers设为字符串数组类型,存储对应用户的文档ID,展示时用Query.in一次拉取所有关联用户的详情:
// 获取当前用户的关注列表详情 const getFollowings = async (currentUserId) => { // 先拿到当前用户的followings数组 const currentUser = await databases.getDocument( YOUR_DB_ID, USERS_COLLECTION_ID, currentUserId ); // 批量查询所有关注的用户 const followedUsers = await databases.listDocuments( YOUR_DB_ID, USERS_COLLECTION_ID, [Query.in('$id', currentUser.followings)] ); return followedUsers.documents; };
这种方式的优势很明显:
- 数据无冗余,用户信息更新后,关注列表展示的永远是最新数据
- 符合数据库设计规范,维护成本低
- 仅需两次API调用(获取当前用户+批量拉取关联用户),性能完全达标
不推荐:存储JSON字符串化的用户数据
把完整用户数据转成JSON字符串存储的问题非常突出:
- 数据不一致:被关注用户更新昵称、头像等信息时,你存在数组里的字符串不会同步更新,除非遍历所有关注他的用户文档逐一修改,这会带来极大的性能开销
- 无法利用数据库查询能力:你没法通过AppWrite的查询语句筛选关注列表里的用户(比如按昵称搜索),只能把字符串取出来解析后再处理,完全浪费了数据库的查询优势
- 存储冗余:重复存储用户数据会占用更多存储空间,长期来看不划算
进阶方案:单独创建关注关系集合
如果你的用户量较大,或者需要更灵活的关注关系统计(比如实时统计关注数、粉丝数),可以单独创建一个follows集合,每条记录包含两个字段:
followerId:粉丝的用户IDfollowingId:被关注用户的ID
这种模式下:
- 查询关注列表:先在
follows集合中筛选followerId等于当前用户ID的记录,拿到followingId数组后再批量查询用户详情 - 查询粉丝列表:在
follows集合中筛选followingId等于当前用户ID的记录,拿到followerId数组后批量查询 - 取消关注:直接删除
follows集合中对应的记录即可,不用修改用户文档的数组,避免了数组操作的并发冲突
这种方案的维护成本稍高,但扩展性更好,适合中大型社交应用。
内容的提问来源于stack exchange,提问作者Tapesh
相关产品推荐
相关产品推荐

