Чтобы упростить задачу, скажем, в приложении есть только 2 сущности: user
и post
, которые создаются пользователями.
Пользователи могут делать 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);
Однако в этом подходе есть некоторые проблемы:
unfollowedBy
в post
Документ не масштабируется, так как размер unfollowedBy
пропорционален размеру пользовательской базы.Я знаю, что все, что будет расти до неограниченного размера, должно быть вложенной коллекцией, а не картой в документе, но, сделав unfollowedBy
вложенной коллекцией, я больше не могу запросить posts
с ней. post
документ будет часто обновляться, если автора часто отписывают, чтобы поддерживать актуальность карты unfollowedBy
. - Любому пользователю потребуется разрешение на обновление поля
unfollowedBy
других сообщений,что не идеально, или мне придется создать облачную функцию для обработки отказов.