Я задаю этот вопрос из-за вашего запроса от здесь .
Когда вы дублируете данные, нужно помнить одну вещь. Точно так же, как вы добавляете данные, вы должны поддерживать их. Другими словами, если вы хотите обновить / обнаружить объект, вы должны делать это в каждом месте, где он существует.
Какие шаблоны (если таковые имеются) обычно используются для отслеживания дублированных данных, чтобы они могли корректно обновляться во избежание несогласованности данных?
Чтобы отслеживать все операции, которые нам необходимо выполнить для получения согласованных данных, мы добавляем все операции в пакет. Вы можете добавить одну или несколько операций update для разных ссылок, а также операции delete или add . Для этого смотрите:
Как насчет создания реляционной таблицы для каждого уникального местоположения, в котором могут существовать данные, которые используются для восстановления путей, требующих обновления.
По моему мнению, нет необходимости добавлять дополнительную "реляционную таблицу", но если вы чувствуете себя комфортно с ней, продолжайте и используйте ее.
Затем вы используете их для восстановления путей дублированных данных для поста (например, /users/[boardOwnerID]/boards/[boardID]/posts/[postID]
)?
Да, вам нужно передать каждому методу document()
соответствующий идентификатор документа, чтобы операция обновления работала. К сожалению, в пути к документам Cloud Firestore нет подстановочных знаков . Вы должны идентифицировать документы по их идентификаторам.
В качестве альтернативы, вы могли бы вместо этого иметь posts_denormalization_tracker, который представляет собой просто набор уникальных идентификаторов postID, который включает в себя подколлекцию местоположений, на которые пост был дублирован?
Я считаю, что в этом нет необходимости, поскольку для этого требуются дополнительные операции чтения. Поскольку в Firestore все касается количества операций чтения и записи, я думаю, вам следует еще раз подумать об этом подходе. Пожалуйста, смотрите Использование Firestore и ограничения .
если только правила безопасности Firestore не являются достаточно мощными, чтобы разрешить операции добавления в подколлекцию / posts_denormalization_tracker / [postID] / location, не разрешая чтение или обновление для подколлекции или родительской коллекции postIDs.
Правила безопасности Firestore настолько мощны, чтобы сделать это. Вы также можете разрешить чтение или запись или даже применять правила безопасности в отношении каждой необходимой вам операции CRUD.
Я в основном ищу разумный способ отследить сильно денормализованные данные.
Самый простой способ, который я могу придумать, это добавить операцию в структуру данных типа ключ и значение. Давайте предположим, что у нас есть карта, которая выглядит так:
Map<Object, DocumentRefence> map = new HashMap<>();
map.put(customObject1, reference1);
map.put(customObject2, reference2);
map.put(customObject3, reference3);
//And so on
Выполните итерации по карте и добавьте все эти ключи и значения в пакет, зафиксируйте пакет и все.