После нашего обсуждения в чате, это отправная точка, которую я бы предложил. Кто знает, как будет выглядеть конечная архитектура, но я думаю, что это или очень близко к этому. Вы говорите, что пользователь может существовать в нескольких хранилищах одновременно, и несколько хранилищ могут содержать одни и те же продукты, в то же время. Вы также сказали, что в хранилище никогда не может быть более 40 пользователей одновременно, поэтому массив из 40 пользователей, безусловно, не будет вторгаться в лимит документов Firestore в 1,048,576
байт.
[collection]
<documentId>
- field: value
[depots]
<UUID>
- depotId: string "depot456"
- productCount: num 5,000
<UUID>
- depotId: string "depot789"
- productCount: num 4,500
[products]
<UUID>
- productId: string "lotion123"
- depotId: string "depot456"
- users: [string] ["user10", "user27", "user33"]
<UUID>
- productId: string "lotion123"
- depotId: string "depot789"
- users: [string] ["user10", "user17", "user50"]
[users]
<userId>
- depots: [string] ["depot456", "depot999"]
<userId>
- depots: [string] ["depot333", "depot999"]
In No SQL, хранилище дешево и вычисления не настолько денормализуют ваши данные, сколько вам нужно, чтобы ваши запросы были возможными и эффективными (быстрыми и дешевыми).
Чтобы найти все хранилища в одном запросе, где user10
и lotion123
оба имеют значение true, запрашивают коллекцию продуктов, где productId
равно x
и users
array-содержит y
и собирают значения depotId
из этих результатов. Если вы хотите сохранить операцию, содержащую массив, для чего-то другого, вам придется дополнительно денормализовать ваши данные (заменить массив для одного пользователя). Или вы можете разделить этот запрос на два отдельных запроса.
В этой модели, когда пользователь покидает депо, получите все продукты, в которых users
массив содержит этого пользователя, и удалите этот userId
из массива. А когда пользователь присоединяется к депо, возьмите все продукты, где depotId
равно x
, и добавьте userId
к массиву.
Просмотрите это видео и другие материалы Рика, чтобы получить solid ручка на № SQL: https://www.youtube.com/watch?v=HaEPXoXVf2k