Алгоритм синхронизации данных клиент-сервер

Клиентская БД - CoreData (iOS)
Серверная БД - MySQL

Я пытаюсь добиться синхронизации данных между клиентом и сервером, но сложность заключается в том, что схема очень реляционная. Я просматривал несколько уже используемых шаблонов синхронизации, и похоже, что большинство из них основано на NOSQL или БД без схемы. Интересно, есть ли какие-нибудь шаблоны синхронизации для высокореляционных данных. Я уже прошел через couchbase, dropbox sync api, wasabi synch и т. Д. Ниже приведены проблемы.

1) Под очень реляционными данными это означает, что существует несколько таблиц, которые связаны друг с другом, и создание / обновление происходит во всех таблицах. Прямо сейчас я планирую выполнять отдельные запросы CRUD для каждой таблицы. Это хороший подход? Но проблема в том, что должен быть строгий порядок запросов, потому что изменения в таблице 3 не могут быть обработаны до получения данных таблицы 2. Эти отношения затрудняют синхронизацию.

2) Отслеживание изменений на клиенте. как лучше всего определить изменения в конкретной таблице (CoreData Entity). Я планирую использовать дельта-подход, при котором за один раз будут загружаться только изменения в объектах аналогичного типа. Любая информация / ссылки на него?

3) Data Merging / ConflictResolution - я наткнулся на эту часть. Один из способов - иметь измененную метку времени в каждом объекте, но что, если даты устройств не синхронизированы или изменены вручную.

Я хотел знать последствия / проблемы в такой схеме синхронизации с сервером, поддерживаемым РСУБД, или любых альтернативных подходах.

Проблема №1 объяснена

Предположим, что существует 10 таблиц, и API-интерфейсы предоставляют запросы CRUD для этих 10 таблиц. 1 Запрос будет выполнять только C / R / U / D любой одной таблицы. Итак, мой вопрос был в том, является ли это хорошим подходом к разработке подобных API, когда дело доходит до автономной синхронизации данных. Например, Рассмотрим реляционные данные

Организация-> Сотрудник-> Отдел-> Проект

Предположим, что некоторые объекты из этих 4 таблиц были созданы в автономном режиме. Теперь нам нужно синхронизировать данные с сервером, когда сеть вернется. Таким образом, это будет похоже на «Сначала создайте / обновите организации», а затем «Создайте / обновите сотрудника», чтобы его можно было связать с организацией. Таким образом, в основном каждый раз, когда C / U / D будет выдаваться от объектов верхнего-> нижнего уровня. Итак, мой вопрос в том, является ли это хорошим подходом к проблеме синхронизации. Потому что, если бы данные не были реляционными, мы могли бы загрузить изменения во все таблицы за один вызов C / U / D API.


person Sj.    schedule 31.07.2015    source источник
comment
Как выглядит ваш серверный API? Или это тоже еще не разработано?   -  person Tom Harrington    schedule 02.08.2015
comment
Сервер @TomHarrington работает на Heroku, а API-интерфейсы разработаны на nodejs.   -  person Sj.    schedule 02.08.2015
comment
На самом деле я имел в виду то, как выглядят вызовы API, а не то, на каких фреймворках они построены. Похоже, вы озабочены попыткой воспроизвести требования MySQL в своем клиентском приложении, что было бы необычно.   -  person Tom Harrington    schedule 02.08.2015
comment
возможный дубликат шаблона / алгоритма синхронизации клиент-сервер?   -  person philipxy    schedule 04.08.2015


Ответы (1)


Похоже, вы могли не знать типичных реляционных СУБД и протоколы, которые

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

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

2) Ваша схема может явно записывать избыточную информацию дельты, которую вы получаете СУБД для расчета при обновлениях, или она может записывать достаточные прошлые изменения для вычисления дельт по запросу. Ваш клиент может передать СУБД свои данные транзакции, а СУБД может возвращать соответствующую информацию на основе этих данных и прошлых периодов. Вероятно, вам не нужно и нужно сохранять какое-либо постоянное состояние на своем клиенте. Для этого и предназначена база данных сервера. Клиентская база данных является буфером для нее и информации о пользователе.

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

Интересно, сколько вы искали в Google?

person philipxy    schedule 04.08.2015
comment
Спасибо за ваш ответ. Я отредактировал свой вопрос с более подробной информацией. # 1 - Пожалуйста, обратитесь к объяснению проблемы 1. Мой вопрос заключался в том, хорош ли этот подход или открыт для каких-либо других альтернатив. # 2 - Это относится исключительно к iOS CoreData, так как изменения должны отслеживаться на клиенте. - person Sj.; 04.08.2015