Я использую Firestore и Flutter (Dart). Этот вопрос более концептуален, чем что-либо еще.
Структура базы данных - это коллекция Users
, содержащая коллекцию от A
до G
(принадлежит пользователю).
На том же уровне, что и от A до Коллекция G (int) lastUpdated
поле. Когда устройство вставляет, обновляет или удаляет в пределах своего фрагмента Firestore, устройство генерирует временную метку и сохраняет ее в lastUpdated
как на Firestore, так и на устройстве. Если пользователь открывает другое устройство с более старой отметкой времени, он сравнивается с сервером, чтобы определить, что ему нужно извлечь данные, а не извлекать данные sh.
Пока все вызовы сервера завершаются до другое устройство пытается внести изменения, все отлично работает.
Но, если кто-то совершает действие на двух устройствах одновременно (или до завершения действий предыдущего устройства), алгоритмы пересекаются, и это либо заканчивается во всех удаляемых или повторяющихся данных.
Я думал о добавлении поля (bool) syncInProgress
в Firestore, которое становится true
при подключении и false
после завершения, но если у кого-то есть устройство отключается во время процесса, он может застрять в true
и эффективно предотвратить все будущие взаимодействия с БД (без вмешательства администратора).
Моя другая мысль заключалась в том, что если устройство получит уведомление о том, что syncInProgress
верно (и поэтому им нужно подождать до синхронизации c), им также может быть представлена кнопка для более поездка, которая вручную установит syncInProgress
обратно в false.
Все это звучит слишком сложно, и обычно, когда это происходит, я что-то обдумываю, и есть лучший способ. Предложения