Как синхронизировать базу данных между устройстами?
Пишу приложения для создания заметок. Если с технической реализацией приложений у меня проблем нет, то вот с "алгоритмами" очень туго.
Дано:
1) Приложение для Android (на basic4android)
2) Приложение для ПК (Windows, Linux) на PyQt5
Выбрал данные технологии, так как они самые простые и я в них разбираюсь.
Вот как отдаленно я представляю себе работу приложений:
На телефоне я создаю краткие заметки (посетить сайт, посмотреть такой-то фильм, скачать песню, сделать для чего-то приложение и т.д.). Далее прихожу домой, запускаю приложение на ПК, и нажимаю кнопку синхронизации (телефон и пк находится в одной сети). (Пока ещё не решил где будет запускаться сервер - в приложении на ПК, или на телефоне, или там и там - но это пока не важно). Далее появляется окошко с просьбой указать ip-адрес "сервера", или происходит поиск в локальной сети работающих хостов, далее отправляется запросы по адресам с нужным портом и в запросе, например, hello, и если получен нужный ответ, значит сервер. Потом самое интересное - начинается синхронизация. Вот тут то у меня и начинаются проблемы.
Возможные ситуации:
1) На телефоне 2 заметки которых нет на ПК. На ПК есть одна заметка, которой нет на телефоне.
2) На одном устройстве удалена заметка, которая есть на других устройствах, и мне нужно при синхронизации удалить данную заметку.
3) И ещё много ситуаций, о которых я ещё не знаю.
Понятно, для каждого приложения нужно создавать уникальный идентификатор. На этом мои мысли закончились. В общем, как я понял, мне нужно сделать приблизительно то же самое, что и в Chrome для закладок.
В идеале было бы неплохо услышать конкретные алгоритмы синхронизации (возможно с каким либо псевдокодом), или ссылки на статьи. В Google 99% результатов для домохозяек о том, как синхронизировать контакты Android.
Делал подобное для бд с разнородными данными, когда у нас есть некая довольно большая база на клиенте, которую нужно синхронизировать с сервером в условиях когда каждый переданный байт данных - на счету.
Алгоритм примерно следующий:
Ведем отдельную таблицу лога - какие записи были добавлены, какие удалены, какие изменены. Каждая запись лога подвязана к некоему id - номеру версии.
Некий клиент при запросе - отправляет сначала номер своей версии. В ответ вы выдаете записи - все изменения с версии клиента и по текущую. После этого клиент синхронизирует свои данные - удаляет удаленные записи, запрашивает новые и измененные.
После окончания синхронизации - происходит инкрементация текущей версии на сервере, и все изменения в БД будут уже с новой версией.