Синхронизация баз данных клиентов и сервера.

Практические советы по работе с FileMaker, типичные задачи и их решения. У вас вопрос? Пишите сюда.
Ответить
Аватара пользователя
Arcady
Администратор
Сообщения: 201
Зарегистрирован: 10 сен 2017, 20:45
Контактная информация:

Синхронизация баз данных клиентов и сервера.

Сообщение Arcady » 04 окт 2017, 09:52

Александр Клочков, поднял этот вопрос к конференции. Но думаю, это важный вопрос и достоен отдельной темы в "Практике".
Ниже текст Александра:
Одна из тем, которую было бы неплохо подготовить для конференции.
Синхронизация баз данных клиентов и сервера.

Один из моих клиентов работает по системе сервер- клиенты.
Все клиенты на iPhone-ах. Они вносят информацию на своих смартфонах . Эта информация, в итоге, должна стать доступной для всех клиентов.
Обмен идет через сервер.
Стоит задача синхронизации базы данных в такой конфигурации. Чтобы на всех телефонах была вся информация .
Сейчас я организовал эту синхронизацию с помощью флагов, которые помечают состояние записей (во всех таблицах) как "отправлено / не отправлено" (у клиента). Или "считано /не считано" каждым из клиентов (на сервере).
Данный метод работает только для новых записей и исключает возможность редактирования записей. Говорят, что есть плагины .
Было бы интересно послушать опытного в этом смысле человека.
Аркадий Перла.
ТриА. Разработка решений для FileMaker
http://tria.pw

andrey volkov
Сообщения: 338
Зарегистрирован: 11 сен 2017, 13:42
Откуда: Санкт-Петербург

Re: Синхронизация баз данных клиентов и сервера.

Сообщение andrey volkov » 04 окт 2017, 12:38

наверное, проще всего плагином это сделать.http://360works.com/filemaker-sync/

Вариант с iPhone я не рассматривал, но вот для в поисках синхронизации десктопных приложений ноги стер до самых колен
самый простой способ - хранить для каждой локальной таблицы дату-время последней синхронизации, затем запросом к серверу (XML запрос) получать записи с датой изменения позже этой временной метки и обновлять локальную таблицу. Импорт (обновление с добавленим отсутствующих записей)

Ну и наверное, аналогичную процедуру можно предусмотреть для обновления данных на центральном сервере. Только здесь проблемы - конфликты: если запись редактируется на сервере, то вы ее не сможете обновить.
У меня для подобных задач (обновить данные на центральном сервере), выработано было решение:
1) синхронизируемые таблицы и поля имели числовые индексы
2) при изменении записи я вношу строку в лог изменений: индекс таблицы, серийный номер записи, индекс поля, новое значение. Образуется "таблица изменений", одна для всех таблиц системы
3) при синхронизации просто передаю накопленные данные из этой таблицы на сервер
4) сервер обрабатывает эти данные следующим образом:
- по индексу таблицы определяет нужную таблицу, находит нужную запись в ней.
- по индексу поля определяет поле и высчитывает значение в нем
- если значения старое и новое не совпадают, то записывается новое значение, в лог, напротив, вписывается старое значение, и он отмечается флагом Учтено, иначе - запись в "логе изменений" удаляется
5) записи в "логе изменений" не удаляются. По реляции эта таблица соединяется с основной таблицей базы данных и в портале можно видеть - кто когда какие значения менял.

Ответить