как программировать, чтобы потом БД на разных филиалах (принесли дамп на флешке или появился на 5 минут интернет) можно было синхронизировать?
из простого, что в голову приходит - это префиксы филиалов в id (1000001, 1000002 - id всех записей в филиале 1 и N000001, N000002,.... в филиале N), но тогда при синхронизации всплывут номенклатуры с одинаковым именем и разным ID, если оба филиала, например впервые купят лампочку и оприходуют ее каждый создав номенклатуру.
Каков принцип построения таких программ, чтобы не изобретать велосипед и не писать свои алгоритмы синхронизации, а пользоваться чем-то стандартным/готовым вроде rsync?
Что и с чем синхронизировать?
Чтобы id не пересекались на нескольких нодах можно использовать UUID.
Можно ещё всякое типа microtime+идентификатор ноды, но вряд ли нужно без каких-то серьёзных требований по производительности
в центральном офисе админ сливает воедино дампы БД принесенные на флешках с филиалов в единую БД и заливает им обратно уже объединенные и они с ними едут домой и там объединяют со своими, чтобы новая номенклатура/контрагенты были общими...
Если БД MySQL можно у autoincrement полей последний разряд отдать под идентификатор сервера, или два.
Гуглить по:
auto_increment_increment
auto_increment_offset
Мы таким образом делали балансировку при master-master репликации. Попутно еще шла репликация на slave сервера.
Младший разряд всегда был равен ID сервера.
Хотя сейчас я бы использовал uuid.
Mylistryx, если забыть про uuid, а зачем морока с разрядами, не проще ли было использовать составной ключ? Или уже неизвестно, просто так "исторически" сложилось?
Vitsliputsli, в коде не использовались модели, точнее где то они использовались, где-то был древнейший legacy и SQL запросы на вставку были чуть ли не во View. Таким образом это оказалось простейшим решением и оно работало. Когда добавляли репликацию серверов код править не пришлось, только поправили конфиги MySQL.