Firestore моделирования данных и запросов для приложения, похожего на Tinder - PullRequest
0 голосов
/ 05 октября 2018

Чтобы упростить задачу, скажем, в приложении есть только 2 сущности: user и post, которые создаются пользователями.

Пользователи могут делать 3 вещи:

  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])
  ...

2-й подход

Добавление поля 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);

Однако в этом подходе есть некоторые проблемы:

  1. unfollowedBy в postДокумент не масштабируется, так как размер unfollowedBy пропорционален размеру пользовательской базы.Я знаю, что все, что будет расти до неограниченного размера, должно быть вложенной коллекцией, а не картой в документе, но, сделав unfollowedBy вложенной коллекцией, я больше не могу запросить posts с ней.
  2. post документ будет часто обновляться, если автора часто отписывают, чтобы поддерживать актуальность карты unfollowedBy.
  3. Любому пользователю потребуется разрешение на обновление поля unfollowedBy других сообщений,что не идеально, или мне придется создать облачную функцию для обработки отказов.
...