Мы планируем внедрить виртуальную файловую систему с использованием Google Firestore.
Идея вложенных коллекций хороша тем, что она позволяет нам моделировать наши данные с точки зрения иерархии папок, например: /folders/folderA/entities/folderB/entities/fileX
Подобно реальной файловой системе, мы хотели бы обрабатывать перемещения между папками, такие как перемещение вложенной подпапки folderB
из родительской folderA
в родительскую folderC
.Действительно, часто бывает, что папка, которую мы хотим переместить, может содержать свои собственные коллекции файлов и папок произвольной глубины K.
Этот комментарий предполагает, что перемещение документане будет автоматически перемещать связанные подколлекции.Точно так же, удаление документа приведет к удалению его подколлекций, оставляя их как сирот.Кажется, что единственный способ переместить папку (и ее сущности) от одного родителя к другому - это использовать рекурсивную стратегию клонирования + удаления, что может быть затруднительно для надежного и транзакционного выполнения, если ее дочерние сущности массивны.
Альтернативой является отказ от использования вложенных коллекций и сохранение всех папок в корневом каталоге, используя поле документа, например parent_id
, для указания на другие документы в плоской коллекции.Это не должно влиять на скорость запросов из-за агрессивной индексации Firestore, , но мы не смогли воспроизвести это утверждение локально;т. е. запросы через вложенные коллекции становятся значительно более производительными, поскольку общее количество документов в БД увеличивается по сравнению с хранением всего на верхнем уровне. Воспроизводимое репо доступно здесь .Обратите внимание, что в репо используется локальный экземпляр эмулятора, а не реальный сервер Firestore.
Любой совет будет очень полезным!