Прежде всего, я знаю, как работает Firestore, и потратил много времени, оценивая различные подходы для создания хорошей структуры. Тем не менее я рассматриваю следующий сценарий:
Есть база известных рецептов. Пользователи могут добавлять рецепты, но они должны быть реальными, а не просто вариациями. Таким образом, каждый пользователь может выбрать рецепты из созданного пользователем списка рецептов, чтобы заявить, что они знают, как их готовить (или добавлять новые).
Теперь я хочу, чтобы пользователи поделились своим списком рецептов с другими, но я не уверен, что лучше всего это сделать с помощью Firestore. Хитрость в том, что я хочу показать все рецепты сразу, и не хочу разбивать их на страницы.
В настоящее время я оцениваю две возможности:
Подколлекция
Всякий раз, когда пользователь делится своим списком, пользователь, просматривающий указанный список, должен будет загрузить весь список рецептов, что может привести к большому количеству прочтений документа (я полагаю, реально ~ 50, в очень редких случаях, возможно, 1000) .
Плюсы:
- Более натуральная структура
- Проще поддерживать (например, удалить рецепт, проверить, существует ли конкретный рецепт)
- Легче добавлять поля (например, timeOfCreation, comment, personalRating, ...)
Минусы:
- Может привести к большому количеству операций чтения в долгосрочной перспективе
Массивы
Я мог бы сохранить каждый известный рецепт (id и imageURL) внутри документа пользователя (или как отдельный вложенный документ "KnownRecipes") в массиве. Этот массив может иметь вид
recipesKnown: [{rid: 293ndwa, imageURL: image1.com, timeAdded: 8371201332},
{rid: 9012831, imageURL: image1.com, timeAdded: 8371201871},
{rid: jd812da, imageURL: image1.com, timeAdded: 8371201118},
...
]
Плюсы:
- Мне нужен только один документ, если кто-то хочет увидеть список другого пользователя
- Чтение списка пользователей, вероятно, быстрее
Минусы:
- Трудно обновить конкретный рецепт (например, кто-то хочет изменить imageURL: мне нужно изменить список локально и отправить весь документ в качестве обновления на сервер - поскольку я не могу просто изменить один элемент в массиве)
- Когда пользователь решает иметь около 1000 рецептов (возможно, этого никогда не произойдет, но может), может быть достигнут предел в 1 МБ для предела Firestore. Возможный обходной путь - создать отдельный документ и разделить эти два массива на эти два документа.
Для меня идея с подколлекциями кажется более «чистым» решением этой проблемы, но, возможно, я упускаю некоторые аргументы о том, почему одно из этих решений было бы лучше другого.
Мои наиболее распространенные запросы следующие (упорядочены по убыванию по важности):
- Какие рецепты может приготовить пользователь
- Добавить рецепт, который пользователь может приготовить, в список пользователей
- Кто может готовить конкретный рецепт (есть рецепт -> Подборка поваров)
- Обновить существующий рецепт, который пользователь может приготовить