Firestore数据建模和查询类似Tinder的应用程序

时间:2018-10-05 08:34:48

标签: firebase nosql google-cloud-firestore data-modeling

为简化起见,假设应用程序只有两个实体:userpost,它们是用户创建的内容。

用户可以做三件事:

  1. 创建帖子
  2. 在帖子上滑动,喜欢或不喜欢
  3. 取消关注帖子的作者,以便他/她不再看到该作者的帖子

我的问题是:如何根据作者是否不跟随我来查询posts

我对数据建模的第一种方法

users/{userId}
- userId

posts/{postId}
- author <userId>
- content

unfollows/{userId}
- userId
- unfollowedUserId

likes/{postId_userId}
- postId
- userId

dislikes/{postId_userId}
- postId
- userId

查询帖子

// get all userIds that I unfollow

const unfollows = collection('unfollows').where('userId', '==', 'myUserId');

但是我不知道如何使用posts来查询unfollows// This doesn't seem correct and // I don't know how to write the `where` filters programmatically: // assume unfollows is already sorted. const unfollows = collection('posts') .where('author', '<', unfollows[0]).where('author', '>', unfollows[0]) .where('author', '<', unfollows[1]).where('author', '>', unfollows[1]) ... 是一个有效的用户ID数组。

unfollowedBy

第二种方法

posts中添加post字段,该字段是用户跟随作者并在unfollows创建时填充并在新users/{userId} - userId posts/{postId} - author <userId> - content - unfollowedBy <Map with userIds as keys> unfollows/{userId} - userId - unfollowedUserId likes/{postId_userId} - postId - userId dislikes/{postId_userId} - postId - userId 进行更新的用户的地图。

posts

这使我可以使用以下查询collection('posts').where(`unfollowedUserId.${myUserId}`, '==', null);

unfollowedBy

但是,这种方法存在一些问题:

    post文档中的
  1. unfollowedBy无法缩放,因为unfollowedBy的大小与用户群的大小成正比。我知道对于任何要增长到无限制大小的东西,都应该是子集合,而不是文档中的地图,但是通过将posts成为子集合,我无法再用它查询post
  2. 如果不经常关注作者,则unfollowedBy文档将经常更新,以使unfollowedBy地图保持最新。
  3. 任何用户都将需要权限来更新其他人的帖子的{{1}}字段,这是不理想的,否则我将不得不创建一个cloud函数来处理未关注的事情。

0 个答案:

没有答案