@pashaa

Как сделать синхронизацию клиента и сервера?

Есть два клиентских приложения, которые могут работать локально и с интернетом синхронизируя свою базу с сервером.
Проблема в том, что если синхронизировать устройство с севером, то информация этого устройства считается актуальной.
Допустим, был удален элемент 121 тогда он и на сервере удаляется, а если синхронизироваться со вторым клиентом то 121 считается как новый, что не верно, так как он просто удален.
Как сделать так чтобы данные удалялись и добавлялись корректно как в гугл календарях, например.
Неужели придётся хранить все время всю историю удаления на сервере.
  • Вопрос задан
  • 100 просмотров
Пригласить эксперта
Ответы на вопрос 2
@rPman
Заведите на сервере понятие update log (машиночитаемый), в который помещайте все события изменения базы данных, это может быть таблица
id (каждое изменение - увеличивается на 1), имя таблица, id в таблице, имя поля, тип (новый, изменен, удален), новое значение, старое значение (опционально)
и заполняйте ее тригерами автоматически

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

Клиентская сторона должна хранить id этой таблицы для последней синхронизированной записи (а так же для первой загрузки, в принципе всю базу можно восстановить с нулеввой записи только долго), все получаемые данные этого лога должны быть больше последнего этого значения, без пропусков.
Ответ написан
Комментировать
neatsoft
@neatsoft
Life is too short for bad software
Soft delete - для фильтрации элементов использовать поле is_deleted (default=False), при удалении присваивать ему значение True, физически строки из базы не удалять (либо удалять после синхронизации со всеми клиентами). При обмене данными опираться на значение поля updated_at (в котором нужно хранить дату последнего редактирования / удаления).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы