Я уже такое реализовывал. Правда на MSSQL 2000, но суть не меняется.
Все сущности БД содержали такие поля:
OBJECT_ID
OBJECT_NAME
OBJECT_DATE_INSERT
OBJECT_USER_INSERT
OBJECT_DATE_UPDATE
OBJECT_USER_UPDATE
DELETED
Выше — это, как бы, параметры класса Object, от которого наследуются все остальные классы.
OBJECT_ID — уникальный для всех объектов БД.
Один основной сервер выделяет раз в сутки диапазоны ID для локальных серверов, и, собственно, раздает их при новой синхронизации.
Синхронизация проходит в 4 этапа:
1. Выбираем новые объекты, созданные на локальном сервере:
LOCAL_SERVER.OBJECT_DATE_INSERT > LAST_SYNC_DATE
2. Выбираем измененные на локальном сервере объекты с момента последней синхронизации:
LOCAL_SERVER.OBJECT_DATE_UPDATE > LAST_SYNC_DATE
3. Выбираем новые объекты, созданные на всех остальных локальных серверах кроме нашего:
REMOTE_LOCAL_SERVER.OBJECT_DATE_INSERT > LAST_SYNC_DATE
4. Выбираем измененные, соответственно, на всех остальных локальных серверах объекты:
REMOTE_LOCAL_SERVER.OBJECT_DATE_UPDATE > LAST_SYNC_DATE