Алгоритм синхронизации баз данных

Ребят, помогите, пожалуйста с алгоритмом синхронизации данных. Не могу придумать логику работы синхронизации. Все, пути, которые я вижу имеют какие-то коллизии, которые я не могу самостоятельно решить.

Имеется: БД на мобильном приложении (клиент) (SqLite)-> одна таблица "tasks" хранит 4 поля "id", "nameTask", "ServerID", "Version" БД в программе для Windows (клиент) (SqLite) -> одна таблица "tasks" хранит 4 поля "id", "nameTask", "ServerID", "Version" БД на сервере (MySQL)-> одна таблица "tasks" хранит 3 поля "id", "nameTask", "Version"

Если я добавил с клиента мобилы новую строку и она получила на сервере ID, что как мне сказать клиенту, что у тебя имеется строка на локальной БД, которую я внес по твоему запросу в БД сервера под таким-то ID, вот получи его и запиши у себя. Как локальной БД понять, что именно этот ServerID относится к определенной строке. Можно, конечно, связать их по типу LocalID-ServerID, но у меня имеется прога для работы под Винду, у которой тоже имеется БД, и на ней ее LocalID будет возможно другой. + я могу сменить телефон, и заново установить приложение, тогда на локальной БД телефона все ID пойдут с 1.

Вопросов на самом деле очень много, начиная от изменений, заканчивая флагами удаления строк, поэтому и прошу подсказать, по какой подробной логике в настоящее время делают синхронизацию данных в аналогичных случаях.

Заранее большое спасибо!


Ответы (1 шт):

Автор решения: Sergei Kirjanov

Можно делать распределенное состояние на основе лога событий:

https://engineering.linkedin.com/distributed-systems/log-what-every-software-engineer-should-know-about-real-time-datas-unifying

В базах данных повсемесно используется redo-лог. Принцип тот же, только в одной системе первична будет таблица, а в другой лог. И таблицы будут как materialized view от лога.

→ Ссылка