Подборка Firestore против массива - PullRequest
0 голосов
/ 30 апреля 2019

Прежде всего, я знаю, как работает 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. Возможный обходной путь - создать отдельный документ и разделить эти два массива на эти два документа.

Для меня идея с подколлекциями кажется более «чистым» решением этой проблемы, но, возможно, я упускаю некоторые аргументы о том, почему одно из этих решений было бы лучше другого.

Мои наиболее распространенные запросы следующие (упорядочены по убыванию по важности):

  • Какие рецепты может приготовить пользователь
  • Добавить рецепт, который пользователь может приготовить, в список пользователей
  • Кто может готовить конкретный рецепт (есть рецепт -> Подборка поваров)
  • Обновить существующий рецепт, который пользователь может приготовить
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...